java - mvc - ¿Por qué se llama dos veces a mi evento Spring ContextRefreshed?
spring tutorial (4)
Tengo un bean Spring ApplicationListener registrado para escuchar los eventos ContextRefreshed. Sin embargo, por alguna extraña razón, recibo dos llamadas al método onApplicationEvent(ContextRefreshedEvent)
al finalizar la inicialización del contexto. ¿Es este comportamiento normal o es indicativo de un problema con mi configuración? Estoy usando Jetty 8 para mi contenedor Servlet.
Mi configuración web.xml relevante es la siguiente
<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>
¡Gracias!
Aunque no especificó un contextConfigLocation para su DispatcherServlet, todavía crea un contexto secundario y el segundo evento actualizado es para ese contexto. Use event.getApplicationContext () para averiguar para qué contexto es el evento.
Parece un error.
https://jira.springsource.org/browse/SPR-6589
Si está utilizando 3.0, inténtelo con la última versión disponible, que es 3.05.
También me pasó a mí, en un oyente de eventos diferente. ( ApplicationListener<AuthenticationFailureBadCredentialsEvent>
)
Sospeché el ContextLoaderListener , y cuando eliminé la declaración del web.xml, la aplicación estaba funcionando correctamente. Luego tuve que averiguar cuál es su propósito, de ContextLoaderListener ...
Rol / Propósito de ContextLoaderListener en Spring?
La respuesta interesante es:
ContextLoaderListener es opcional. Solo para resaltar un punto: puede iniciar una aplicación Spring sin tener que configurar ContextLoaderListener ... solo el web.xml mínimo básico con DispatcherServlet
Yo también tuve este problema, pero lo arreglé. Estaba inyectando el DataSource en mi DAO (y creando una instancia de JdbcTemplate) ... pero también tenía un bean Spring configurado para JDBCTemplate.
Debería haber estado inyectando mi DAO con la plantilla jdbc ... que evita el duplicado.