0

问题

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

bind(MyFilter.class).in(Singleton.class);
filter("path").through(MyFilter.class);

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

例子

带有我的示例代码的 Bitbucket 存储库

  • 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:为测试环境(Grizzly webserver)创建Guice Injector。与 ApplicationSetup 一样,它也使用 ApplicationModule 作为其 ServletModules 之一。此外,它还有一种方法可以启动 Grizzly 网络服务器以进行测试。
  • src / test / java / TestHelloWorldEndPoint.java:在 /api/helloworld 上执行 GET 请求,并检查响应是否将“Via”标头设置为 MyFilter。这失败了。

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

我已经为这个问题苦苦挣扎了很长一段时间,因此现在花时间在这里问这个问题。我真的希望有人可以帮助我解决这个问题。解决方法也受到赞赏。

4

0 回答 0