2

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

4

1 回答 1

2

我将此归结为人为错误。

我曾经注册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.

于 2013-04-17T01:06:20.453 回答