将spring从3.0.5升级到Spring 4.3,DelegatingFilterProxy initbean方法抛出java.lang.UnsupportedOperationException

时间:2017-11-30 06:32:56

标签: spring

我有一个在Java6,Spring 3.0.5,Hibernate 3,CXF 2.5和glassfish3上运行的应用程序。现在我升级到java8,Spring 4.3,Hibernate 4.3,CXF 3.0和glassfish5。 升级后,应用程序似乎至少在基本功能方面运行良好。但我面临的问题是在部署应用程序时,过滤器未正确初始化。 DelegatingFilterProxy无法初始化我们在web.xmlapplication-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初始化之后被调用,因此在初始化过滤器时请求属性为空。

对此方面的任何帮助表示高度赞赏。

0 个答案:

没有答案