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
<struts> <bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" /><span style="color: rgba(0, 128, 0, 1)"><!--</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)">--></span> <span style="color: rgba(0, 0, 255, 1)"><</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)">/></span> <span style="color: rgba(0, 0, 255, 1)"><</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)">/></span> <span style="color: rgba(0, 0, 255, 1)"><</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)">/></span> <span style="color: rgba(0, 0, 255, 1)"><</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)">/></span> <span style="color: rgba(0, 0, 255, 1)"><</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)">></span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">interceptors</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"><</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)">/></span> <span style="color: rgba(0, 0, 255, 1)"><</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)">/></span> <span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">interceptors</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">package</span><span style="color: rgba(0, 0, 255, 1)">></span>
</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" />
记录一下错误,方便查看。