Como injetar dependências no HTTPSessionListener, usando o Spring?
-
19-09-2019 - |
Pergunta
Como injetar dependências no HTTPSessionListener, usando a primavera e sem chamadas, como context.getBean("foo-bar")
?
Solução
Como o Servlet 3.0 ServletContext possui um método "AddListener", em vez de adicionar seu ouvinte no seu arquivo web.xml, você pode adicionar através do código como assim:
@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");
}
}
}
O que significa que você pode injetar normalmente no "MyHttpSessionListener" e com isso, simplesmente a presença do feijão no contexto do seu aplicativo fará com que o ouvinte seja registrado no contêiner
Outras dicas
Você pode declarar seu HttpSessionListener
como um feijão no contexto da primavera e registre um proxy de delegação como um ouvinte real em web.xml
, algo assim:
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);
}
...
}
Com a primavera 4.0, mas também funciona com 3, implementei o exemplo detalhado abaixo, ouvindo ApplicationListener<InteractiveAuthenticationSuccessEvent>
e injetar o HttpSession
https://stackoverflow.com/a/19795352/2213375