java.lang.IllegalStateException at org.apache.coyote.tomcat5.CoyoteResponseFacade.setBufferSize - PullRequest
2 голосов
/ 07 декабря 2011

У меня запущено приложение Java на сервере Glassfish с использованием JSF 2.0.2.

на уровне JSF У меня следующий вызов метода.

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

Мой метод doOpenVehicleToPrintInPDF определяется следующим образом:

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), а затем генерируется исключение ниже.Я отладил это, и исключение приходит после return null;

Любой намек, что здесь не так и как избежать этого исключения?

Заранее спасибо.

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)

Ответы [ 2 ]

6 голосов
/ 07 декабря 2011

Жизненный цикл JSF пытается выполнить запись в закрытый поток во время фазы рендеринга.Чтобы предотвратить это, вы должны позвонить responseComplete() на FacesContext.

5 голосов
/ 07 декабря 2011

Если вы сами генерируете контент в методе действия, вам следует сообщить о реализации jsf, что вы это сделали. Это должно быть сделано путем вызова responseComplete для FacesContext.

...