我GuiceFilter
在 Jetty 下使用。通常一切正常,但是当我突然启用WebAppContext.setParentLoaderPriority(true)
一个 HTTP 请求时,会导致同一个过滤器被调用两次。更糟糕的是,第二次调用使用与第一次相同的请求范围,所以我收到异常,告诉我我正在尝试使用已经关闭的数据库连接。到底是怎么回事?!
1 回答
我将此归结为人为错误。
我曾经注册GuiceFilter
过一次,WebAppContext.addFilter(GuiceFilter.class, "/*", EnumSet.allOf(DispatcherType.class))
但我忘记了我的项目还包含一个WEB-INF/web.xml
文件。Jetty 正在解析这个文件并注册第二个GuiceFilter
实例。所以第一个错误是注册GuiceFilter
了两次。
为什么这个问题只有在WebAppContext.setParentLoaderPriority(true)
被调用时才可见?好吧,通常 JettyWEB-INF/web.xml
从 webapp 中解析。因为每个 webapp 都有一个私有的 ClassLoader,所以你最终会得到GuiceFilter
该类的两个实例。每一个都被单独初始化,这意味着您的过滤器被添加到单独的GuiceFilter.pipeline
实例中。
调用时WebAppContext.setParentLoaderPriority(true)
,只有一个 GuiceFilter 类的实例,并且您的过滤器会两次添加到同一管道中。这意味着现在您的过滤器将在每个请求范围内多次调用。
要解决此问题,只需删除WEB-INF/web.xml
.