2011-01-20 25 views
25

Me gustaría inyectar una dependencia en un ServletContextListener. Sin embargo, mi enfoque no está funcionando. Puedo ver que Spring está llamando a mi método setter, pero más tarde cuando se llama al contextInitialized, la propiedad es null.Spring - Inyectando una dependencia en un ServletContextListener

Aquí está mi estableció:

El ServletContextListener:

public class MyListener implements ServletContextListener{ 

    private String prop; 

    /* (non-Javadoc) 
    * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent) 
    */ 
    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     System.out.println("Initialising listener..."); 
     System.out.println(prop); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent event) { 
    } 

    public void setProp(String val) { 
     System.out.println("set prop to " + prop); 
     prop = val; 
    } 
} 

web.xml: (este es el último oyente en el archivo)

<listener> 
    <listener-class>MyListener</listener-class> 
</listener> 

applicationContext.xml:

<bean id="listener" class="MyListener"> 
    <property name="prop" value="HELLO" /> 
</bean> 

Salida:

set prop to HELLO 
Initialising listener... 
null 

Cuál es la forma correcta para lograr esto?

Respuesta

17

Me resolvieron mediante la eliminación de la judía oyente y la creación de un nuevo bean de mis propiedades . Luego utiliza el siguiente en mi oyente, para obtener las propiedades de frijol: obras

@Override 
public void contextInitialized(ServletContextEvent event) { 

    final WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext()); 
    final Properties props = (Properties)springContext.getBean("myProps"); 
} 
+0

La forma en que los beans son instanciados dificultan las pruebas, vea mi respuesta. –

-1

ServletContextListener es creado por el servidor, no por Spring.

EDITAR: AFAIK, no puede lograr lo que está intentando, ¿cuál es el motivo por el que desea establecer variables de instancia en el oyente?

+0

@dogbane ¿Qué es lo que estás tratando de hacer? ServletContextListener es para monitorear el ciclo de vida de una aplicación web. – saugata

5

Como se mencionó anteriormente, ServletContextListener es creado por el servidor y por lo tanto no es administrado por la primavera.

Si desea ser notificado de la ServletContext, se puede implementar la interfaz:

org.springframework.web.context.ServletContextAware 
+0

Lo siento, no entiendo por qué tengo que implementar 'ServletContextAware'? Mi oyente ya tiene una referencia al 'ServletContext' porque está presente en el' ServletContextEvent'. – dogbane

+0

si usa el oyente, no puede inyectar dependencias de primavera, por lo que ServletContextAware es una alternativa –

1

no se puede tener la primavera de hacer eso, como ya se ha dicho que es creado por el servidor. Si necesita pasar parametros a su oyente, puede definir en su web xml como un context-param

<context-param> 
     <param-name>parameterName</param-name> 
     <param-value>parameterValue</param-value> 
    </context-param> 

Y en el oyente puede recuperarla, como a continuación;

event.getServletContext().getInitParameter("parameterName") 

Edición 1:

Vea el enlace a continuación para otra posible solución:

How to inject dependencies into HttpSessionListener, using Spring?

+0

Me gustaría pasar un bean in No name-values. – dogbane

+0

@dogbane, vea la publicación editada. Agregó un nuevo enlace que también puede ser útil para su caso – fmucar

28

la respuesta de la adelfa (aceptados) pero hace prueba difícil debido a la forma en que se crean instancias de los granos.Prefiero el enfoque sugerido en este question:

@Autowired private Properties props; 

@Override 
public void contextInitialized(ServletContextEvent sce) { 
    WebApplicationContextUtils 
     .getRequiredWebApplicationContext(sce.getServletContext()) 
     .getAutowireCapableBeanFactory() 
     .autowireBean(this); 

    //Do something with props 
    ... 
}  
+3

Sé que esto es viejo, pero para los lectores futuros, cuando intento esto obtengo una 'IllegalStateException' con el mensaje * No se encontró WebApplicationContext: no ContextLoaderListener registrado? * – christopher

+0

Chris: ¡Tengo el mismo problema! –

+0

Esto funcionó para mí ... gracias abd –

Cuestiones relacionadas