Servlet 3.0注解与Guice的结合使用

6

我正在尝试更新一个遗留的Guice应用程序,并且想知道在考虑Servlet 3.0注释时是否有任何首选方法来处理事情。例如,我的应用程序有一个过滤器FooFilter,它在Guice模块工厂方法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个回答

0

我刚刚草拟了一个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 框架)配置系统。

老实说,我只是草拟了一下,从未尝试过它是否有效。但希望它能够起作用。如果您有任何问题或疑问,请随时让我知道。

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


Milan,你在生产或测试中使用过这个吗?扫描完成后有任何问题吗? - oberger
1
我刚刚检查了代码,它间接地回答了我的问题,即Servlet和Filter仍然必须通过Guice进行注册。谢谢。 - oberger
嗨,Guice目前还不直接支持Servlet 3.0注解。因此,这是一种解决方法,但它可以满足您的需求。正如您所说,我只是使用Guice API来注册过滤器,因此在生产中使用它应该没有问题。 - Milan Baran
Milan,你不觉得这种做法会干扰真正的Servlet 3.0容器吗?这个解决方案只适用于servlet容器<3.0。我的意思是,servlet 3.0容器也会尝试使用自己的扫描机制来注册servlet。我认为在这种情况下,我们必须插入JEE的API/SPI。你怎么看? - taharqa
塔哈尔卡的问题非常有意义。 - Bruno Medeiros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接