Servlet 3.0 注释与 Guice 结合使用

Posted

技术标签:

【中文标题】Servlet 3.0 注释与 Guice 结合使用【英文标题】:Servlet 3.0 annotations in conjuction with Guice 【发布时间】:2013-11-21 05:46:51 【问题描述】:

我正在尝试更新旧的 Guice 应用程序,我想知道在考虑 Servlet 3.0 注释时是否有任何首选的做事方式。比如我的应用有一个过滤器FooFilter,它是在Guice Module Factory方法configureServlets()中定义的,如下:

    Map<String, String> fooParams = new HashMap<String, String>();
    fooParams.put("someParam", "parameter information");                              
    filter("/foo.jsp","/foo/*").through(com.example.filter.FooFilter.class, fooParams);

上述绑定是否仍然必要,或者它会干扰使用@WebFilter Servlet 3.0 注释的以下内容:

    @Singleton
    @WebFilter(
        filterName="FooFilter",
        urlPatterns="/foo.jsp", "/foo/*",
        initParams = 
                    @WebInitParam(name="foo", value="Hello "),
                    @WebInitParam(name="bar", value=" World!")
                 )
    public class FooFilter implements Filter 
    etc....

现在首选哪种方法?会不会互相打扰?

【问题讨论】:

【参考方案1】:

我刚刚草拟了一个 Servlet 3.0 支持的外观。可能有一种更优雅的方法可以在 configureServlet 方法中调用 filter(Filter Class with WebFilter annotation),但这需要更新对 guice-servlet 模块的权限,这很难分发。

嗯,我做的是 Github 上的一个项目:https://github.com/xbaran/guice-servlet3

您需要做的就是下载和构建。它是在 Guice 3.0 之上创建的,工作方式如下:

new Servlet3Module() 
      @Override
      protected void configureServlets3() 
        scanFilters(FooFilter.class.getPackage());
      
;

Servlet3Module 扩展 ServletModule 并包含带有 package 参数的 scanFilters 方法。此方法将从您的类路径中扫描提供的包,并尝试通过 filter() 方法注册所有带有注释 WebFilter 的类。

这个scan的想法是基于Sitebricks(Dhanji R. Prasanna创建的guice web框架)配置系统。

老实说,我只是做一个草稿,如果它有效,从不尝试。但希望它会。如果您有任何问题或疑问,请告诉我。

PS:如果您愿意,可以添加对 servlet、侦听器等的支持。

【讨论】:

Milan,你在生产或测试中使用过这个吗?扫描完成后是否有任何问题? 我刚刚检查了代码,它间接回答了我的问题,即 servlet 和过滤器仍必须通过 Guice 注册。谢谢。 嗨,Guice 还不直接支持 Servlet 3.0 注释。因此,这是一种解决方法,但它可以满足您的需要。正如你所说,我只是使用 Guice API 注册过滤器,所以在生产中使用它应该没有问题。 Milan,你不认为这种做法会干扰真正的 Servlet 3.0 容器吗?此解决方案适用于 taharqa 问题很有意义。

以上是关于Servlet 3.0 注释与 Guice 结合使用的主要内容,如果未能解决你的问题,请参考以下文章

Servlet注释与部署描述符

使用 Guice 3.0 + JaxRS 2.0 对 REST API 进行版本控制

使用 Guice 和 Undertow 在 Camel 中使用 rest Servlet

使用 Google Guice Servlet 配置 Apache Shiro

第三方小服务程序的 Guice Singleton Servlet Binding 解决方法

如何从 Guice 的注入器中检索带注释的实例?