Подтвердить что ты не робот

Почему мое событие 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>

Спасибо!

4b9b3361

Ответ 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..., который позволяет избежать дублирования.