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

标签 jetty guice

我在 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/

相关文章:

java - 如何在 Google App Engine 中停止 Jetty 网络服务器

java - notnoop java-apns 抛出 javax.net.ssl.SSLHandshakeException :Received fatal alert: handshake_failure

java - 对集合成员使用带有辅助注入(inject)的 Guice 多重绑定(bind)

jsf-2 - Jetty 上的 JSF2 随机给出 'zip file closed' 但在从 maven jetty 插件运行时有效(jetty :run)

java - DWR - Jetty 9 中的 splinter 反射异常

java - 如何管理对 servlet-api 的依赖?

java - Guice 辅助注入(inject)过度使用替代方案,依赖注入(inject)与非 DI 构造函数

java - guice - 提供者始终返回相同的实例

java - Jetty 服务器的可扩展负载均衡器

java - 使用 OWL API 4.0.x 时出现 NoSuchMethodError