我在我的项目中使用 guice 和 guice servlet。我可以使用 serve(...) 和 filter(...) 方法在 servlet 模块中映射 servlet 和过滤器。如何在 servlet 模块中注册一个监听器(web.xml 中的监听器标签)。我正在使用 HttpSessionAttributeListener。
我想在我的听众中使用 guice 注入器。我尝试使用 bindListener(..),但这似乎不起作用。
问候
我在我的项目中使用 guice 和 guice servlet。我可以使用 serve(...) 和 filter(...) 方法在 servlet 模块中映射 servlet 和过滤器。如何在 servlet 模块中注册一个监听器(web.xml 中的监听器标签)。我正在使用 HttpSessionAttributeListener。
我想在我的听众中使用 guice 注入器。我尝试使用 bindListener(..),但这似乎不起作用。
问候
我能想到几个选择。
(1) 正常注册您的侦听器(在 web.xml 中)并从 servlet 上下文属性中检索注入器。 GuiceServletContextListener
初始化后将注入器实例放入 servlet 上下文中,属性名称为Injector.class.getName()
. 我不确定这是否已记录或支持,因此您可能需要为注入器定义自己的属性名称并自己将其放在那里。只需确保您考虑了侦听器的初始化顺序——在调用您的 GuiceServletContextListener 之前,注入器不会被绑定。
class MyListenerExample implement HttpSessionListener { // or whatever listener
static final String INJECTOR_NAME = Injector.class.getName();
public void sessionCreated(HttpSessionEvent se) {
ServletContext sc = se.getSession().getServletContext();
Injector injector = (Injector)sc.getAttribute(INJECTOR_NAME);
// ...
}
}
(2) 如果您使用 Java Servlets API 3.0+ 版本,您可以调用addListener
ServletContext。我可能会建议您在创建注入器时正确执行此操作,尽管您可以在任何地方执行此操作。这种方法对我来说有点 hacky,但应该有效。
public class MyServletConfig extends GuiceServletContextListener {
ServletContext servletContext;
@Override
public void contextInitialized(ServletContextEvent event) {
servletContext = event.getServletContext();
// the super call here is where Guice Servlets calls
// getInjector (below), binds the ServletContext to the
// injector and stores the injector in the ServletContext.
super.contextInitialized(event);
}
@Override
protected Injector getInjector() {
Injector injector = Guice.createInjector(new MyServletModule());
// injector.getInstance(ServletContext.class) <-- won't work yet!
// BIND HERE, but note the ServletContext will not be in the injector
servletContext.addListener(injector.getInstance(MyListener.class));
// (or alternatively, store the injector as a member field and
// bind in contextInitialized above, after the super call)
return injector;
}
}
请注意,在上述所有组合中,不保证在 GuiceFilter 管道中调用侦听器。因此,特别是,尽管它可能有效,但我建议您不要依赖在侦听器中访问请求范围的对象,包括 HttpServletRequest 和 HttpServletResponse。
根据 guice文档,ServletModule
仅用于配置 servlet 和过滤器。
This module sets up the request and session scopes, and provides a place to configure your filters and servlets from.
所以在你的情况下,你必须将你的监听器添加到你的web.xml
并以某种方式获取注入器。