我在 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 从 web 应用程序中解析 WEB-INF/web.xml 。因为每个 Web 应用程序都有一个私有(private) ClassLoader,所以您最终会得到 GuiceFilter
类的两个实例。每个过滤器都会单独初始化,这意味着您的过滤器将添加到单独的 GuiceFilter.pipeline
实例中。
当调用 WebAppContext.setParentLoaderPriority(true)
时,GuiceFilter 类只有一个实例,并且您的过滤器会两次添加到同一管道中。这意味着现在您的过滤器将在每个请求范围内被调用多次。
要解决此问题,只需删除 WEB-INF/web.xml
即可。
关于jetty - 将 GuiceFilter 与 Jetty WebAppContext.setParentLoaderPriority(true) 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16049731/