2011-10-10 56 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 –