当前位置: 代码迷 >> Web前端 >> struts2启动报错com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:1
  详细解决方案

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

热度:669   发布时间:2013-10-21 17:03:30.0
struts2启动报错com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1

好久没有搞struts2,今天配置strut2.2.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

解决办法:在web.xml中加入:

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

?原理:

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

<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。所以导致了启动的问题

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

?错误2:IOException parsing XML document from ServletContext resource [/WEB-INF/class

解决办法1:在web.xml中加入如下代码

<context-param>
    <param-name>contextConfigLocation </param-name>
    <param-value>/WEB-INF/classes/applicationContext.xml </param-value>
</context-param>
问题主要由于加载spring的默认配置文件位置一般是在/WEB-INF/下找applicationContext.xml文件。
而Myeclipse文件自动生成的applicationContext文件是放在/WEB-INF/classes/applicationContext.xml。
所以在默认加载中是找不到applicationContext.xml文件的,必须加入上面配置。
 
解决方法2:
将IDE自动生成的applicationContext.xml放到WEB-INF 文件夹下即可。
  相关解决方案