将GuiceFilter与Jetty一起使用WebAppContext.setParentLoaderPriority(true)

时间:2013-04-17 01:06:20

标签: jetty guice

我在Jetty下使用GuiceFilter。通常情况下一切正常,但是当我突然启用WebAppContext.setParentLoaderPriority(true)时,单个HTTP请求会导致同一个过滤器被调用两次。更糟糕的是,第二次调用使用与第一次调用相同的请求范围,因此我得到异常,告诉我我正在尝试使用已经关闭的数据库连接。发生了什么事?!

1 个答案:

答案 0 :(得分:2)

我将此追踪归结为人为错误。

我使用GuiceFilter注册了WebAppContext.addFilter(GuiceFilter.class, "/*", EnumSet.allOf(DispatcherType.class)),但我忘记了我的项目还包含WEB-INF/web.xml文件。 Jetty正在解析此文件并注册第二个GuiceFilter实例。所以第一个错误是两次注册GuiceFilter

为什么只有在调用WebAppContext.setParentLoaderPriority(true)时才能看到此问题?好吧,通常Jetty会从webapp中解析WEB-INF/web.xml。因为每个webapp都有一个私有的ClassLoader,所以最终会得到GuiceFilter类的两个实例。每个人都会单独初始化,这意味着您的过滤器会被添加到单独的GuiceFilter.pipeline实例中。

调用WebAppContext.setParentLoaderPriority(true)时,只有一个GuiceFilter类实例,并且您的过滤器会被添加两次到相同管道。这意味着现在每个请求范围都会多次调用您的过滤器。

要解决此问题,只需删除WEB-INF/web.xml