2011-05-28 18 views
15

Tengo un Spring ApplicationListener Bean registrado para escuchar los eventos ContextRefreshed. Sin embargo, por alguna extraña razón, recibo dos llamadas al método onApplicationEvent(ContextRefreshedEvent) al completar 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.¿Por qué mi evento Spring ContextRefreshed se llama dos veces?

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!

Respuesta

23

Aunque no especificó una contextConfigLocation para su DispatcherServlet, aún crea un contexto secundario y el segundo evento actualizado es para ese contexto. Use event.getApplicationContext() para averiguar a qué contexto está destinado el evento.

+1

¡Eso fue todo! Usando la propiedad 'id' o' displayName' de ApplicationContext, ahora puedo distinguir entre los dos eventos. – Andre

+3

O si usted @Autowire the appContext (o implementa ApplicationContextAware) puede comparar ese appContext contra el del evento. – sourcedelica

+0

@Andre Pregunta de un novato: ¿Cómo acceder a ID o displayName desde ContextRefreshedEvent? –

1

Parece un error.

https://jira.springsource.org/browse/SPR-6589

Si está utilizando 3.0 probarlo en la última versión disponible, que es de 3.05.

+0

Ok, estamos utilizando la versión 3.0.4 por lo que' Daré una inyección de 3.0.5 e informaré de mis hallazgos. – Andre

+0

Bah, actualizó a 3.0.5 y sigue siendo un problema. – Andre

+0

Even 3.1 tiene el mismo problema. – Deckard

1

Tuve este problema pero lo solucioné. Estaba inyectando dataSource en mi DAO (y creando una instancia de JdbcTemplate) ... pero también tuve un Spring Bean configurado para JDBCTemplate.

Debería haber estado inyectando mi DAO con jdbcTemplate ... que evita el duplicado.

2

me pasó a mí también, en un evento-oyente diferente. (ApplicationListener<AuthenticationFailureBadCredentialsEvent>)

Yo sospechaba que los ContextLoaderListener, y cuando quité la declaración del web.xml, la aplicación funcionaba correctamente. Luego tuve que averiguar cuál es su propósito, de la ContextLoaderListener ...

Role/Purpose of ContextLoaderListener in Spring?

la respuesta interesante se encuentra:

ContextLoaderListener es opcional. Sólo para hacer un punto aquí: usted puede arranque una aplicación de primavera sin tener que configurar ContextLoaderListener ... sólo el web.xml mínimo básico con DispatcherServlet

Cuestiones relacionadas