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)


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)


原因:

struts2导入的jar包中加入了struts-spring-plugin这个插件的jar


		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-spring-plugin</artifactId>
			<version>2.2.1</version>
		</dependency>

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

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


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

原理:

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

<struts>
<beantype="com.opensymphony.xwork2.ObjectFactory"name="spring"class="org.apache.struts2.spring.StrutsSpringObjectFactory"/>
<!--  Make the Spring object factory the automatic default -->
<constantname="struts.objectFactory"value="spring"/>
<constantname="struts.class.reloading.watchList"value=""/>
<constantname="struts.class.reloading.acceptClasses"value=""/>
<constantname="struts.class.reloading.reloadConfig"value="false"/>
<packagename="spring-default">
<interceptors>
<interceptorname="autowiring"class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
<interceptorname="sessionAutowiring"class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/>
</interceptors>
</package>
</struts>


<struts>
    <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" />


    <constant name="struts.class.reloading.watchList" value="" />
    <constant name="struts.class.reloading.acceptClasses" value="" />
    <constant name="struts.class.reloading.reloadConfig" value="false" />

    <package name="spring-default">
        <interceptors>
            <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
            <interceptor name="sessionAutowiring" class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/>
        </interceptors>
    </package>    
</struts>

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


<beantype="com.opensymphony.xwork2.ObjectFactory"name="spring"class="org.apache.struts2.spring.StrutsSpringObjectFactory"/>
<!--  Make the Spring object factory the automatic default -->
<constantname="struts.objectFactory"value="spring"/>


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