2012-06-01 5 views
6

Ho un'azione chiamata GetFile che apre direttamente una finestra di download di file per aprire il PDF.struts2 - java.lang.IllegalStateException si verifica a intermittenza mentre le chiamate di azione generano flusso per scaricare il file PDF

Di seguito è riportata la configurazione struts.xml e la classe di azione per lo stesso. Sto usando il tipo di risultato come flusso per raggiungere questo obiettivo. Vedo che la casella di download del pdf si apre tutte le volte e sono anche in grado di scaricare il file.

Ma trovo che ci fossero alcune richieste la scorsa notte che aveva sparato l'azione e che ha prodotto l'errore di seguito.

org.apache.jasper.JasperException: java.lang.IllegalStateException: getOutputStream() has already been called for this response 
     at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:570) 
     at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:452) 
     at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391) 
     at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684) 
     at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:593) 
     at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:530) 
     at org.apache.struts2.dispatcher.ServletDispatcherResult.doExecute(ServletDispatcherResult.java:159) 
     at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186) 
     at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:374) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:278) 
     at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:211) 
     at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249) 
     at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249) 
     at deshaw.irweb.web.interceptor.AuthInterceptor.intercept(AuthInterceptor.java:60) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249) 
     at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54) 
     at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:510) 
     at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:434) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394) 
     at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:294) 
     at org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:183) 
     at org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:169) 
     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
     at java.lang.Thread.run(Thread.java:722) 
Caused by: java.lang.IllegalStateException: getOutputStream() has already been called for this response 
     at org.apache.catalina.connector.Response.getWriter(Response.java:636) 
     at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:205) 
     at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:105) 
     at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125) 
     at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118) 
     at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:182) 
     at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:123) 
     at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:80) 
     at org.apache.jsp.jsp.ServerError_jsp._jspService(ServerError_jsp.java:157) 
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
     at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419) 
     ... 38 more  

Qualcuno può dirmi che cosa potrebbe aver causato il problema? Non sono in grado di riprodurre il problema attualmente. Ho letto da qualche parte che potrebbe essere dovuto alla chiusura della finestra di download, ma non è stato il caso nemmeno dopo aver provato da più browser. Controllato anche getOutputStream() has already been called for this response, ma non può riguardare direttamente il mio problema in quanto non vi è alcun reindirizzamento a jsp in quanto l'azione struts2 conduce direttamente al flusso di risultati.

struts.xml

<action name="GetFile" class="Class" method="DownloadFile"> 
      <result name="success" type="stream"> 
      <param name="contentType">contentType</param> 
      <param name="contentDisposition">fileName</param> 
      <param name="bufferSize">1024</param> 
      <param name="inputName">inputStream</param> 
      </result> 
</action> 

Class Action

public String DownloadFile() 
{ 
     // create the object variable pdfdoc which is a custom object. 
     // You can assume that the pdfdoc is properly constructed 
     // and getFileContent does what it is required to do, so 
     // that the final pdf is generated. 
     ... 
     ... 
     inputStream = new ByteArrayInputStream(pdfdoc.getFileContent()); 
     contentType = pdfdoc.getContentType(); 
     fileName = pdfdoc.getFileName(); 
     contentDisposition = doc.getContentDisposition(); 
     bufferSize = 1024; 
     return "success"; 

} 
+0

Potete per favore inviare completa analisi dello stack e, in breve, se questo comportamento non è riproducibile la sua difficile indovinare il comportamento degli utenti. –

+0

Aggiunto traccia stack completo –

+0

L'azione ha qualche parametro? –

risposta

1

Ho avuto un problema simile quando si utilizza Internet Explorer e ha risolto il tutto aggiungendo questo nell'intestazione di risposta:

response.setHeader("Expires","0"); 
response.setHeader("Pragma","cache"); 
response.setHeader("Cache-Control","private"); 

Forse le richieste che vedi nel tuo log sono state generate da Internet Explorer.

Dai un'occhiata allo here e allo here!

Update: Per stampare la versione del browser nel registro si può fare qualcosa di simile:

System.out.println(request.getHeader("User-Agent")); 
+0

Grazie. Anche se potrebbe essere un problema con IE, puoi dirmi il comportamento esatto degli utenti in IE che potrebbe aiutarmi a riprodurre il problema? –

+0

Prova con diverse versioni di IE e quando esegui il test rimuovi l'url dai siti attendibili e guarda il registro per vedere cosa succede quando ti viene chiesto con il messaggio che il download è stato bloccato. – tibtof

+1

@TGV se la mia risposta non è di aiuto per favore dimmelo e lo rimuoverò. Non voglio ottenere ricompense immeritevoli. – tibtof

Problemi correlati