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 结合使用的主要内容,如果未能解决你的问题,请参考以下文章
使用 Guice 3.0 + JaxRS 2.0 对 REST API 进行版本控制
使用 Guice 和 Undertow 在 Camel 中使用 rest Servlet
使用 Google Guice Servlet 配置 Apache Shiro