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