我需要执行一个操作,当Guice Servlet会话到期时,该操作将访问ServletContext中的项目。 (为什么?要通过打开的websocket连接来销毁会话并关闭它们;这些连接保存在ServletContext
中。)
要在基本的Servlet Web应用程序中实现这一点,可以实现HttpSessionListener并挂钩sessionDestroyed
方法。
如何使用Google Guice进行依赖注入的Web应用程序实现此目的?
回顾能够访问ServletContext
的要求;我已经遇到this forum conversation,但没有发现它有用。
答案 0 :(得分:0)
添加会话侦听器没有“Guice方式”。可悲的是。但是从会话侦听器访问servlet上下文没有问题。
注册会话监听器:
public class MyServletConfig extends GuiceServletContextListener {
private Injector injector;
@Override
public void contextInitialized(final ServletContextEvent servletContextEvent) {
injector = Guice.createInjector(new MyAppModule());
registerSessionListeners(servletContextEvent.getServletContext(), injector);
super.contextInitialized(servletContextEvent);
}
private void registerSessionListeners(final ServletContext servletContext, final Injector injector) {
servletContext.addListener(injector.getInstance(WebsocketCloser.class));
}
@Override
protected Injector getInjector() {
return injector;
}
}
访问servlet上下文是会话侦听器:
public class WebsocketCloser implements HttpSessionListener {
@Override
public void sessionCreated(final HttpSessionEvent httpSessionEvent) {
// no-op
}
@Override
public void sessionDestroyed(final HttpSessionEvent httpSessionEvent) {
// do cleanup: httpSessionEvent.getSession().getServletContext();
}
}