2011-12-07 9 views
1

JSF 2.0.2を使用してGlassfishサーバー上でJavaアプリケーションを実行しています。java.lang.IllegalStateException(org.apache.coyote.tomcat5.CoyoteResponseFacade.setBufferSize)

JSFレベル以下のメソッド呼び出しがあります。メソッドが呼び出される

public String doOpenVehicleToPrintInPDF() { 
    FacesContext ctxt = FacesContext.getCurrentInstance(); 
    HttpServletResponse response = (HttpServletResponse) ctxt.getExternalContext().getResponse();  

    try { 
     response.setContentType("application/pdf"); 
     response.setHeader("Content-disposition", "attachment; filename=\"" + configUrl + ".pdf\""); 

     final ServletOutputStream stream = response.getOutputStream(); 

     final VehiclePrintSummaryToPdf vehiclePrintPdf = new VehiclePrintSummaryToPdf(ctxt, summary); 
     vehiclePrintPdf.createPdfDocument(stream, summary); 
     stream.flush(); 
     Validate.isTrue(response.isCommitted()); 
     stream.close(); 
    } catch (Exception ex) { 
     LOG.error("Error in PDF print processing!", ex);    
    } 
    return null; 
} 

は、PDFが生成され、その後、以下の例外がスローされます(iTextのライブラリを使用して)次のように

<h:commandLink action="#{printWB.doOpenVehicleToPrintInPDF}" target="_blank">Print</h:commandLink> 

私の方法doOpenVehicleToPrintInPDFが定義されています。私はこれをデバッグしましたが、例外はの戻り値の後に来ます。

ここで何が間違っているのか、この例外を回避する方法を教えてください。

ありがとうございます。

java.lang.IllegalStateException 
    at org.apache.coyote.tomcat5.CoyoteResponseFacade.setBufferSize(CoyoteResponseFacade.java:260) 
    at com.sun.faces.context.ExternalContextImpl.setResponseBufferSize(ExternalContextImpl.java:795) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.createResponseWriter(FaceletViewHandlingSt 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.jav 
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126) 
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313) 
    at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:427) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:333) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at com.bmw.codis.ncc.web.entrypoint.EntryServletFilterNCC.doFilter(EntryServletFilterNCC.java:98) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:313) 
    at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
    at org.apache.catalina.core.StandardPipeline.doChainInvoke(StandardPipeline.java:599) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:92) 
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java: 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) 
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) 
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096) 
    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:288) 
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java 
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:579 
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831) 
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:34 
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263) 
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214) 
    at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265) 
    at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106) 
+1

私は理解できないことは、なぜ戻り値の型 "文字列"を持っていますか?しかし、常に "null"を返しますか? – ComputerSaysNo

+0

@Dorin: 'null 'を返すと、同じビューにポストバックする必要があることが通知されます。 'void 'を返すことは同じで、より洗練されたIMOです。 – BalusC

+0

@BalusCありがとう、知らなかった、私は問題が何とかそこにあると思った... – ComputerSaysNo

答えて

5

JSFのライフサイクルは、そのレンダリングフェーズの間に、閉じたストリームに書き込もうとしています。これを防ぐには、FacesContextresponseComplete()に電話する必要があります。

+0

ありがとう! +1 – Luixv

4

アクションメソッドでコンテンツを自分で生成している場合は、jsf実装に通知してください。これは、FacesContext上でresponseCompleteを呼び出すことによって行う必要があります。

+0

コメントありがとうございます! +1 – Luixv

関連する問題