2011-10-10 55 views
2

有时,此异常会引发到我的struts 2应用程序中。 无法复制它,当我想要时,它只是随机弹出。Struts 2 - 已执行的操作异常

Struts has detected an unhandled exception: 
Messages: 
Action has already executed 
File: com/opensymphony/xwork2/DefaultActionInvocation.java 
Line number: 240 

Stacktraces 
java.lang.IllegalStateException: Action has already executed 

com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:240) 
xxx.yyy.zzz.qqq.ddd.interceptors.AuthInterceptor.invoke(AuthInterceptor.java:68) 
xxx.yyy.zzz.qqq.ddd.interceptors.AuthCCareInterceptor.checkAuthenticateInvoke(AuthCCareInterceptor.java:142) 
xxx.yyy.zzz.qqq.ddd.interceptors.AuthInterceptor.intercept(AuthInterceptor.java:59) 
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) 
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:498) 
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) 
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185) 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151) 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) 
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269) 
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) 
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
java.lang.Thread.run(Thread.java:722) 

对不起, “xxx.yyy.zzz.qqq.ddd”,但它是机密信息。我相信你明白!

感谢:-)

回答

5

问题是我们在拦截器中保存了变量,比如被调用的动作实例。重构后,一切都开始正常工作!

拦截器需要是线程安全的(如servlets)。

+0

良好的工作:)跟踪这种事情可能会令人沮丧。 –

+0

@miguel Ribeiro你的意思是重构?你可以详细说明同样的问题吗? – Babel

+0

@miguel Ribeiro我没有使用这个方法'invokeActionOnly()'它工作正常。 – Babel

3

其中这三个拦截器很可能打破:

interceptors.AuthInterceptor.invoke(AuthInterceptor.java:68) 
interceptors.AuthCCareInterceptor.checkAuthenticateInvoke(AuthCCareInterceptor.java:142) 
interceptors.AuthInterceptor.intercept(AuthInterceptor.java:59) 

显然不能告诉你,远远超出与所提供的信息。

+0

嗯,我认为可能有这种情况发生的原因。如果它是一个破碎的拦截器,我不应该能够重现执行完全相同的操作的错误吗? –

+1

取决于它是如何破的,我想。有很多移动部件,但由于我一直在使用w/S2,我*从未*看到过这个 - 它当然可以是框架中的东西,但没有更多的信息,我不会知道如何找出答案。 –

+0

你认为哪种信息有助于识别问题? :-P –