inyeccion - ¿Cómo inyectar dependencias en HttpSessionListener, usando Spring?
spring core ejemplo (3)
Con Spring 4.0 pero también funciona con 3, implementé el ejemplo que se detalla a continuación, escuchando ApplicationListener<InteractiveAuthenticationSuccessEvent>
e inyectando HttpSession
https://stackoverflow.com/a/19795352/2213375
¿Cómo inyectar dependencias en HttpSessionListener, usando Spring y sin llamadas, como context.getBean("foo-bar")
?
Dado que Servlet 3.0 ServletContext tiene un método "addListener", en lugar de agregar su oyente en su archivo web.xml, puede agregarlo a través del siguiente código:
@Component
public class MyHttpSessionListener implements javax.servlet.http.HttpSessionListener, ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (applicationContext instanceof WebApplicationContext) {
((WebApplicationContext) applicationContext).getServletContext().addListener(this);
} else {
//Either throw an exception or fail gracefully, up to you
throw new RuntimeException("Must be inside a web application context");
}
}
}
lo que significa que puede inyectar normalmente en "MyHttpSessionListener" y con esto, simplemente la presencia del bean en el contexto de la aplicación hará que el oyente se registre en el contenedor
Puede declarar su HttpSessionListener
como un bean en el contexto de Spring, y registrar un proxy de delegación como un oyente real en web.xml
, algo como esto:
public class DelegationListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent se) {
ApplicationContext context =
WebApplicationContextUtils.getWebApplicationContext(
se.getSession().getServletContext()
);
HttpSessionListener target =
context.getBean("myListener", HttpSessionListener.class);
target.sessionCreated(se);
}
...
}