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

将GuiceFilter与Jetty WebAppContext.setParentLoaderPriority一起使用(true),jetty,guice,Jetty,Guice,我正在Jetty下使用GuiceFilter。通常一切正常,但当我启用WebAppContext.setParentLoaderPriority(true)时,一个HTTP请求会导致同一个筛选器被调用两次。更糟糕的是,第二次调用使用与第一次调用相同的请求范围,因此出现异常,告诉我正在尝试使用已关闭的数据库连接。怎么回事 我发现这是人为错误 我曾经使用WebAppContext.addFilter(GuiceFilter.class,“/*”,EnumSet.allOf(DispatcherTyp

我正在Jetty下使用
GuiceFilter
。通常一切正常,但当我启用
WebAppContext.setParentLoaderPriority(true)
时,一个HTTP请求会导致同一个筛选器被调用两次。更糟糕的是,第二次调用使用与第一次调用相同的请求范围,因此出现异常,告诉我正在尝试使用已关闭的数据库连接。怎么回事

我发现这是人为错误

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

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

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

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