struts2启动报错com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1

tomcat 启动报错:

Class: com.opensymphony.xwork2.spring.SpringObjectFactory 
File: SpringObjectFactory.java 
Method: getClassInstance 
Line: 220 - com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1 
    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:428
    at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:69
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:51
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:295
    at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3838
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4488
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:785
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443
    at org.apache.catalina.core.StandardService.start(StandardService.java:519
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710
    at org.apache.catalina.startup.Catalina.start(Catalina.java:581
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25
    at java.lang.reflect.Method.invoke(Method.java:585
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414
Caused by: java.lang.NullPointerException 
    at com.opensymphony.xwork2.spring.SpringObjectFactory.getClassInstance(SpringObjectFactory.java:220

  解决方法

web.xml 中没有配置加载 spring ApplicationContext 相关的 listener

<listener>  
    <listener-class>  
        org.springframework.web.context.ContextLoaderListener  
    </listener-class>  
</listener>  

原理:

查看 struts2 插件struts2-spring-plugin 中的 strtus-plugin.xml

Xml 代码  收藏代码
<struts>  
    <bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />  
<span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">  Make the Spring object factory the automatic default </span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>  
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">constant </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="struts.objectFactory"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">="spring"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>  


<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">constant </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="struts.class.reloading.watchList"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">=""</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>  
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">constant </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="struts.class.reloading.acceptClasses"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">=""</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>  
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">constant </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="struts.class.reloading.reloadConfig"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">="false"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>  

<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">package </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="spring-default"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>  
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">interceptors</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>  
        <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">interceptor </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="autowiring"</span><span style="color: rgba(255, 0, 0, 1)"> class</span><span style="color: rgba(0, 0, 255, 1)">="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>  
        <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">interceptor </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="sessionAutowiring"</span><span style="color: rgba(255, 0, 0, 1)"> class</span><span style="color: rgba(0, 0, 255, 1)">="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>  
    <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">interceptors</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>  
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">package</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>      

</struts>

 

 

 注意下面部分,表明该插件引入工程后,会自动设置 Struts 的ObjectFactory 为StrutsSpringObjectFactory,从而让 Spring 的 IOC 容器来托管 Struts 的 Action。所以导致了启动的问题。

 

Xml 代码  收藏代码
  1. <bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />  
    <!--  Make the Spring object factory the automatic default -->  
    <constant name="struts.objectFactory" value="spring" />   

     

    

记录一下错误,方便查看。

 

原文地址 http://javeye.iteye.com/blog/940122