2012-06-01 10 views
6

Mam akcję o nazwie GetFile, która bezpośrednio otwiera okno pobierania pliku, aby otworzyć plik PDF.struts2 - java.lang.IllegalStateException występuje sporadycznie podczas wywołania akcji, aby pobrać plik PDF

Poniżej znajduje się konfiguracja struts.xml i klasa akcji dla tego samego. Używam typu wyniku jako strumienia, aby to osiągnąć. Widzę, że okno pobierania pdf otwiera się cały czas i jestem również w stanie pobrać plik.

Ale okazało się, że wczoraj wieczorem były pewne prośby, które wywołały akcję i spowodowały błąd poniżej.

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  

Czy ktoś może mi powiedzieć, co mogło spowodować problem? Obecnie nie mogę odtworzyć problemu. Czytałem gdzieś, że może to być spowodowane zamknięciem okna pobierania, ale nie było tak nawet po tym, jak próbowałem z wielu przeglądarek. Sprawdziłem także getOutputStream() has already been called for this response, ale nie mogłem bezpośrednio odnosić się do mojego problemu, ponieważ nie ma przekierowania do jsp, ponieważ akcja struts2 bezpośrednio prowadzi do strumienia wyników.

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> 

Akcja Class

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

Czy należy zakładać pełną ślad stosu i krótko mówiąc, jeśli takie zachowanie nie jest powtarzalna jej trudno odgadnąć zachowania użytkowników. –

+0

Dodano pełny ślad stosu –

+0

Czy akcja ma jakieś parametry? –

Odpowiedz

1

miałem podobny problem przy użyciu programu Internet Explorer i naprawić go, dodając to w nagłówku odpowiedzi:

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

Może wnioski, które widzisz w dzienniku, generowane przez Internet Explorer.

Zobacz here i here!

Aktualizacja: Aby wydrukować wersję przeglądarki w swoim dzienniku można zrobić coś takiego:

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

Dzięki. Chociaż może to być problem z IE, Czy możesz powiedzieć mi dokładnie zachowanie użytkownika w IE, które może mi pomóc odtworzyć problem? –

+0

Wypróbuj kilka wersji IE, a po przetestowaniu usuń swój adres z zaufanych stron i obejrzyj dziennik, aby zobaczyć, co się stanie, gdy pojawi się komunikat, że pobieranie zostało zablokowane. – tibtof

+1

@TGV, jeśli moja odpowiedź nie jest pomocna, proszę mi powiedzieć, a ja to usunę. Nie chcę otrzymywać niezasłużonych premii. – tibtof