我有一个在Java6,Spring 3.0.5,Hibernate 3,CXF 2.5和glassfish3上运行的应用程序。现在我升级到java8,Spring 4.3,Hibernate 4.3,CXF 3.0和glassfish5。
升级后,应用程序似乎至少在基本功能方面运行良好。但我面临的问题是在部署应用程序时,过滤器未正确初始化。 DelegatingFilterProxy
无法初始化我们在web.xml
和application-context.xml
中声明的过滤器bean。因此,过滤器未应用于请求。
的web.xml
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<filter>
<filter-name>formatRequest</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>formatRequest</filter-name>
<servlet-name>CXFServlet</servlet-name>
</filter-mapping>
应用context.xml中
<bean id="formatRequest"
class="org.api.filters.FormatRequestFilter" scope="request"/>
服务器日志中出现异常
Caused by: java.lang.UnsupportedOperationException
at java.util.AbstractMap.put(AbstractMap.java:209)
at org.springframework.web.context.request.FacesRequestAttributes.setAttribute (FacesRequestAttributes.java:125)
at org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:45)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:340)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1084)
at org.springframework.web.filter.DelegatingFilterProxy.initDelegate(DelegatingFilterProxy.java:326)
at org.springframework.web.filter.DelegatingFilterProxy.initFilterBean(DelegatingFilterProxy.java:235)
at org.springframework.web.filter.GenericFilterBean.init(GenericFilterBean.java:236)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:267)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:123)
我的发现至今
RequestAtext在RequestContextHolder.getRequestAttributes()方法中为空。 以下是RequestContextHolder.java中的一段代码,我在其中观察到了这个问题:
RequestContextHolder.java:
public static RequestAttributes getRequestAttributes() {
RequestAttributes attributes = (RequestAttributes)requestAttributesHolder.get();
if(attributes == null) {
attributes = (RequestAttributes)inheritableRequestAttributesHolder.get();
}
return attributes;
}
我们在web.xml中声明的RequestContextListener应将这些属性设置为RequestContextHolder。不知怎的,这种情况并没有发生,而且新部署的RequestAttributes列表也是空的。
使用spring3,首先调用RequestContextListener
并设置Request Attributes。然后过滤器bean初始化正确发生。使用spring4 RequestContextListener
在过滤器bean初始化之后被调用,因此在初始化过滤器时请求属性为空。
对此方面的任何帮助表示高度赞赏。