Sometimes, this exception is thrown in my struts 2 application.
Can’t replicate it when I want, it just pops out randomly.
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)
Sorry for the “xxx.yyy.zzz.qqq.ddd” but it is confidential information. I’m sure you understand!
Thanks 🙂
The problem is that we were saving variables in the interceptor, such as the action instance that was invoked. After a refactoring everything started to work normally!
Interceptors need to be thread-safe (like servlets).