Jersey端点上的请求不会在我的JUnit测试中通过Guice的ServletModule过滤

时间:2015-05-29 14:50:48

标签: junit jersey guice grizzly guice-servlet

问题

我正在使用Jersey开发RESTful API。为了允许在单元测试中模拟对象,我使用了依赖注入框架Guice(特别是Guice-Servlet)。通过覆盖ServletModule的configureServlet()方法并添加:

,可以通过自己的Filter实现过滤请求。
bind(MyFilter.class).in(Singleton.class);
filter("path").through(MyFilter.class);

在Tomcat中运行我的webapp时,我的请求通过此MyFilter类正确过滤。但是,在我的JUnit测试中,我的所有请求都没有通过它进行过滤。任何人都可以帮我找到问题吗?

实施例

Bitbucket repository with my example code

  • web / WEB-INF / web.xml :由Tomcat使用。将ApplicationSetup定义为路径'/ api /*'上的GuiceFilter。
  • src / main / java / ApplicationSetup.java :为生产环境(Tomcat webserver)创建Guice Injector。使用ApplicationModule作为其ServletModule之一。
  • src / main / java / ApplicationModule.java :ServletModule,用于在路径'/ api /*'上配置和绑定MyFilter和Jersey端点。
  • src / main / java / endpoints / HelloWorldEndPoint.java :路径'/ api / helloworld'的简单端点,带有GET请求的方法。
  • src / main / java / MyFilter.java :如果请求通过此过滤器,则在响应中设置“Via”标头。
  • src / test / java / TestApplicationSetup.java :为测试环境创建Guice Injector(Grizzly webserver)。与ApplicationSetup一样,它也使用ApplicationModule作为其ServletModule之一。此外,它还有一种方法可以启动Grizzly Web服务器以进行测试。
  • src / test / java / TestHelloWorldEndPoint.java :在/ api / helloworld上执行GET请求,并检查响应是否将“Via”标头设置为MyFilter。这失败了。

这里的要点是ApplicationModule,两个环境都使用它来绑定过滤器。如果检查示例的日志记录,您会注意到MyFilter在两个环境中都已初始化(在init()方法中进行简单打印)。您还会注意到ApplicationModule用于两种环境中的servlet配置。但不知何故,Grizzly网络服务器忽略了过滤器。

我一直在努力解决这个问题很长一段时间,所以现在花时间在这里提出这个问题。我真的希望有人可以帮助我。解决方法也很受欢迎。

0 个答案:

没有答案