Почему мое событие Spring ContextRefreshed вызывается дважды?
У меня есть Spring ApplicationListener bean, зарегистрированный для прослушивания событий ContextRefreshed. Однако по какой-то нечетной причине я получаю два вызова метода onApplicationEvent(ContextRefreshedEvent)
при завершении инициализации контекста. Является ли это нормальным поведением или это указывает на проблему с моей конфигурацией? Я использую Jetty 8 для своего контейнера Servlet.
Моя соответствующая конфигурация web.xml выглядит следующим образом
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/spring/spring-config.xml</param-value>
</context-param>
<servlet>
<servlet-name>Spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet-mapping>
<servlet-name>Spring</servlet-name>
<url-pattern>/service/*</url-pattern>
</servlet-mapping>
Спасибо!
Ответы
Ответ 1
Даже если вы не указали contextConfigLocation для своего DispatcherServlet, он по-прежнему создает дочерний контекст, а второе обновленное событие для этого контекста. Используйте event.getApplicationContext(), чтобы узнать, в каком контексте это событие.
Ответ 2
это случилось и со мной, на другом слушателе событий. (ApplicationListener<AuthenticationFailureBadCredentialsEvent>
)
Я подозревал ContextLoaderListener, и когда я удалил объявление из web.xml, приложение работало правильно. Затем я должен был выяснить, какова его цель, ContextLoaderListener...
Роль/Цель ContextLoaderListener в Spring?
Интересный ответ:
ContextLoaderListener является необязательным. Просто, чтобы сказать здесь: вы можете загрузите приложение Spring без настройки ContextLoaderListener... просто базовый минимальный web.xml с DispatcherServlet
Ответ 3
Он выглядит как ошибка.
https://jira.springsource.org/browse/SPR-6589
Если вы используете 3.0, попробуйте в последней доступной версии, которая составляет 3.05.
Ответ 4
У меня тоже была эта проблема, но она была исправлена. Я вводил dataSource в свой DAO (и создавал экземпляр JdbcTemplate с ним).... но у меня также был Spring bean, настроенный для JDBCTemplate.
Мне следовало бы вводить мой DAO с помощью jdbcTemplate..., который позволяет избежать дублирования.