2012-06-01 11 views
6

Tengo una acción llamada GetFile que abre directamente un cuadro de descarga de archivos para abrir PDF.struts2 - java.lang.IllegalStateException se produce de forma intermitente mientras que las llamadas de acción se ejecutan para descargar el archivo PDF

A continuación se muestra la configuración de struts.xml y la clase de acción para la misma. Estoy usando el tipo de resultado como transmisión para lograr esto. Veo que el cuadro de descarga de PDF se abre todo el tiempo y también puedo descargar el archivo.

Pero me parece que hubo algunas solicitudes ayer por la noche que habían activado la acción y que ha producido el siguiente error.

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  

¿Alguien me puede decir qué pudo haber causado el problema? No puedo reproducir el problema actualmente. Leí en alguna parte que podría deberse al cierre del diálogo de descarga, pero no fue el caso, incluso después de que intenté desde múltiples navegadores. También marcó getOutputStream() has already been called for this response, pero no pudo relacionarse directamente con mi problema ya que no hay una redirección a jsp ya que la acción de struts2 conduce directamente a la secuencia de resultados.

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> 

Clase Acción

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

¿Puede usted por favor, puesto completo seguimiento de la pila y, en definitiva, si este comportamiento no es reproducible es difícil de adivinar el comportamiento del usuario. –

+0

Se agregó traza de pila completa –

+0

¿La acción toma algún parámetro? –

Respuesta

1

que tenía un problema similar cuando se utiliza Internet Explorer y se fijaron mediante la adición de esto en la cabecera de respuesta:

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

Tal vez las solicitudes que ve en su registro sean generadas por Internet Explorer.

¡Echa un vistazo a here y here!

Actualización: Para imprimir la versión del navegador en su registro puede hacer algo como esto:

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

Gracias. Aunque podría ser un problema con IE, ¿podría decirme el comportamiento exacto del usuario en IE que podría ayudarme a reproducir el problema? –

+0

Pruebe con varias versiones de IE y, cuando lo pruebe, elimine su URL de sitios confiables y mire el registro para ver qué ocurre cuando se le solicita que se bloquee la descarga. – tibtof

+1

@TGV si mi respuesta no es de ayuda, dígamelo y lo eliminaré. No quiero recibir recompensas inmerecidas. – tibtof

Cuestiones relacionadas