I am trying to track down a bug in my Struts application and am having difficulty understanding the cause. Only about once per week, I get an "getOutputStream() has already been called" error - see stack trace below. Anyone experienced this before (and found a solution)? I have included my struts interceptor stack, the last "custom" interceptor that is accessed before the error, and the actual stacktrace. Just FYI, the AccountInterceptor class seems to exist successfully at "line 56: return invocation.invoke();"
*[struts interceptor stack]* <interceptor-stack name="myDefaultStack"> <interceptor-ref name="noCacheInterceptor" /> <interceptor-ref name="sessionInterceptor" /> <interceptor-ref name="accountInterceptor" /> <interceptor-ref name="exceptionInterceptor"> <param name="logEnabled">true</param> <param name="logLevel">ERROR</param> </interceptor-ref> <interceptor-ref name="servletConfig"/> <interceptor-ref name="prepare"/> <interceptor-ref name="modelDriven"/> <interceptor-ref name="fileUpload"/> <interceptor-ref name="checkbox"/> <interceptor-ref name="multiselect"/> <interceptor-ref name="staticParams"/> <interceptor-ref name="actionMappingParams"/> <interceptor-ref name="params"/> <interceptor-ref name="conversionError"/> <interceptor-ref name="validation"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="debugging"/> </interceptor-stack> *[Last Interceptor Accessed]* public class AccountInterceptor extends AbstractInterceptor { private static final String RESULT_IN_ACTIVE_ACCOUNT = "inActiveAccount"; private static final String RESULT_PASSWORD_RESET = "passwordReset"; @Autowired private transient AppUserGoalsDao appUserGoalsDao; @Autowired private transient MailChimpConnectDao mailChimpConnectDao; @Autowired private transient MojoConnectDao mojoConnectDao; public String intercept(ActionInvocation invocation) throws Exception { Map<String, Object> session = invocation.getInvocationContext().getSession(); MyAppSession myAppSession = new MyAppSession(appUserGoalsDao, mailChimpConnectDao, mojoConnectDao); myAppSession.setSession(session); if (myAppSession.getUser()!=null) { // Redirect if account is "inactive" in some way if (!myAppSession.getUser().getTeam().getTeamHelper().getIsTeamAccessAllowed()) { return RESULT_IN_ACTIVE_ACCOUNT; // Redirect if password reset required } else if (myAppSession.getUser().getPasswordChangeRequired()) { return RESULT_PASSWORD_RESET; } } else { ActionSupport actionSupport = (ActionSupport) invocation.getAction(); actionSupport.addActionError("Your session has expired or you are not logged in."); return ActionSupport.LOGIN; } return invocation.invoke(); } } *[Log Error]* Date Thread Level Logger MDC Message 2020-03-09 19:26:39,626 ajp-nio-8009-exec-7 ERROR org.apache.struts2.dispatcher.DefaultDispatcherErrorHandler Exception occurred during processing request: java.lang.IllegalStateException: getOutputStream() has already been called for this response org.apache.jasper.JasperException: java.lang.IllegalStateException: getOutputStream() has already been called for this response at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:634) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:509) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:728) at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:591) at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:527) at org.springframework.security.web.header.HeaderWriterFilter$HeaderWriterRequestDispatcher.include(HeaderWriterFilter.java:178) at org.apache.struts2.result.ServletDispatcherResult.doExecute(ServletDispatcherResult.java:171) at org.apache.struts2.result.StrutsResultSupport.execute(StrutsResultSupport.java:206) at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:375) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:279) at com.afs.web.struts.interceptor.AccountInterceptor.intercept(AccountInterceptor.java:56) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249) at com.afs.web.struts.interceptor.SessionInterceptor.intercept(SessionInterceptor.java:71) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249) Caused by: java.lang.IllegalStateException: getOutputStream() has already been called for this response at org.apache.catalina.connector.Response.getWriter(Response.java:584) at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:211) at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:109) at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:109) at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:109) at org.springframework.security.web.util.OnCommittedResponseWrapper.getWriter(OnCommittedResponseWrapper.java:155) at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:109) at org.springframework.security.web.util.OnCommittedResponseWrapper.getWriter(OnCommittedResponseWrapper.java:155) at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:118) at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:111) at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:176) at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:120) at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:75) at org.apache.jsp.struts.common.error.error_jsp._jspService(error_jsp.java:187) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476) ... 81 common frames omitted