IReports com JSF

6 respostas
lblanco

Bom dia a todos,

Depois de algumas pesquisas sem sucesso, resolvi recorrer a vocês. Necessito criar um projeto em JSF que faça a abertura de arquivos Jasper. Já tenho um Servlet que faz este trabalho para mim, mas gostaria de passa-lo para JSF.

Na tentativa de fazer esta conversão e juntamente com algumas pesquisas consegui gerar o método abaixo que está em meu ManagedBean:

public void openIReports() {
        try {

            /*Instancia as variaveis*/
            vSession   = "15914677";
            reportName = "XXX";
            tpAmbiente = "PRD";

            /**/
            ServletOutputStream responseStream;
            responseStream     = response.getOutputStream();
         

            /*Abre a conexão*/
            conexao();

            //Seta o tipo de aplicação do relatório
            response.setContentType("application/pdf");

            // Na variavel pathJasper ficara o caminho do diretório para os relatórios compilados (.jasper)
            pathJasper = "\\\\Corp01\\Sistemas\\ora_prod\\iReports\\";

            System.out.println("Completo... "+pathJasper);
            
            Map parameters = new HashMap();
            parameters.put("Title"   , reportName);
            parameters.put("pSession", vSession  );
            parameters.put(JRParameter.REPORT_LOCALE, new Locale("pt","BR"));

            // Carrega relatório
            JasperPrint print = JasperFillManager.fillReport(pathJasper + reportName + "." + reportType, parameters, conn);

            //exporta para pdf e exibe no browser sem criar um arquivo fisico em sua maquina
            byte[] buffer  = JasperExportManager.exportReportToPdf(print);
            
            //define os cabecalhos do header
            response.setHeader("Pragma", "");
            response.setHeader("Cache-Control", "");
            response.setHeader("Expires", "");
            response.setContentLength(buffer.length);

            //Escreve o relatorio no response
            ServletOutputStream ouputStream = response.getOutputStream();
            ouputStream.write(buffer, 0, buffer.length);
            ouputStream.flush();
            ouputStream.close();
            response.flushBuffer();
            context.responseComplete();

        }catch (JRException e) {
          e.printStackTrace();
        } catch(Exception ex){
         ex.printStackTrace();
        }
    }

Quando o método é executado o erro abaixo é gerado e pelo NetBeans é apontado que o problema esta na linha ouputStream.flush();

java.lang.IllegalStateException
        at com.sun.faces.context.FacesContextImpl.assertNotReleased(FacesContextImpl.java:639)
        at com.sun.faces.context.FacesContextImpl.responseComplete(FacesContextImpl.java:587)
        at br.com.bebidasipiranga.controller.AsController.openIReports(AsController.java:160)
        at br.com.bebidasipiranga.controller.AsController.buscaCidade(AsController.java:75)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.el.parser.AstValue.invoke(AstValue.java:191)
        at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
        at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:98)
        at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
        at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
        at javax.faces.component.UICommand.broadcast(UICommand.java:315)
        at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775)
        at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267)
        at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
        at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
        at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
        at java.lang.Thread.run(Thread.java:662)
25/02/2011 11:21:55 com.sun.faces.lifecycle.InvokeApplicationPhase execute
AVISO: String index out of range: 0
java.lang.StringIndexOutOfBoundsException: String index out of range: 0
        at java.lang.String.charAt(String.java:686)
        at javax.faces.application.NavigationCase.getToViewId(NavigationCase.java:269)
        at com.sun.faces.application.NavigationHandlerImpl.determineViewFromActionOutcome(NavigationHandlerImpl.java:580)
        at com.sun.faces.application.NavigationHandlerImpl.findWildCardMatch(NavigationHandlerImpl.java:394)
        at com.sun.faces.application.NavigationHandlerImpl.getViewId(NavigationHandlerImpl.java:282)
        at com.sun.faces.application.NavigationHandlerImpl.handleNavigation(NavigationHandlerImpl.java:159)
        at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:130)
        at javax.faces.component.UICommand.broadcast(UICommand.java:315)
        at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775)
        at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267)
        at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
        at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
        at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
        at java.lang.Thread.run(Thread.java:662)
25/02/2011 11:21:55 com.sun.faces.renderkit.RenderKitUtils renderHtmlErrorPage
AVISO: JSF1087: Não foi possível gerar a página de erro de Facelets porque a resposta já foi enviada.
25/02/2011 11:21:55 com.sun.faces.renderkit.RenderKitUtils renderHtmlErrorPage
GRAVE: javax.faces.FacesException: String index out of range: 0
javax.faces.FacesException: String index out of range: 0
        at com.sun.faces.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:136)
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
        at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
        at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
        at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: 0
        at java.lang.String.charAt(String.java:686)
        at javax.faces.application.NavigationCase.getToViewId(NavigationCase.java:269)
        at com.sun.faces.application.NavigationHandlerImpl.determineViewFromActionOutcome(NavigationHandlerImpl.java:580)
        at com.sun.faces.application.NavigationHandlerImpl.findWildCardMatch(NavigationHandlerImpl.java:394)
        at com.sun.faces.application.NavigationHandlerImpl.getViewId(NavigationHandlerImpl.java:282)
        at com.sun.faces.application.NavigationHandlerImpl.handleNavigation(NavigationHandlerImpl.java:159)
        at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:130)
        at javax.faces.component.UICommand.broadcast(UICommand.java:315)
        at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775)
        at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267)
        at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
        ... 17 more
25/02/2011 11:21:55 com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
GRAVE: Error Rendering View[/index.xhtml]
java.lang.IllegalStateException: getOutputStream() has already been called for this response
        at org.apache.catalina.connector.Response.getWriter(Response.java:610)
        at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
        at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:112)
        at com.sun.faces.context.ExternalContextImpl.getResponseOutputWriter(ExternalContextImpl.java:719)
        at com.sun.faces.application.view.FaceletViewHandlingStrategy.createResponseWriter(FaceletViewHandlingStrategy.java:854)
        at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:357)
        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.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
        at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
        at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
        at java.lang.Thread.run(Thread.java:662)
25/02/2011 11:21:55 com.sun.faces.renderkit.RenderKitUtils renderHtmlErrorPage
AVISO: JSF1087: Não foi possível gerar a página de erro de Facelets porque a resposta já foi enviada.
25/02/2011 11:21:55 com.sun.faces.renderkit.RenderKitUtils renderHtmlErrorPage
GRAVE: javax.faces.FacesException: getOutputStream() has already been called for this response
javax.faces.FacesException: getOutputStream() has already been called for this response
        at com.sun.faces.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:136)
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
        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.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
        at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
        at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
        at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.IllegalStateException: getOutputStream() has already been called for this response
        at org.apache.catalina.connector.Response.getWriter(Response.java:610)
        at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
        at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:112)
        at com.sun.faces.context.ExternalContextImpl.getResponseOutputWriter(ExternalContextImpl.java:719)
        at com.sun.faces.application.view.FaceletViewHandlingStrategy.createResponseWriter(FaceletViewHandlingStrategy.java:854)
        at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:357)
        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)
        ... 17 more

Alguém pode me ajudar a enxergar onde está o meu erro?
Obrigado.

6 Respostas

renanpto

E ai cara, isso acontece devido ao ciclo de vida de JSF.

Aqui implementação a solução, mas acabamos utilizando um servlet ainda XD. Utilizamos icefaces.

No backing bean é adicionado script js para abrir janela com a url para o servlet que irá gerar o pdf.

± assim:

JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(), "window.open(\"" + path + "\",\"janela_temporaria\");");

lblanco

Oi Renato,

Obrigado pela resposta. Fiz o teste e funcionou, porém um dos motivos da migração da aplicação que está em Servlet para o JSF é a possibilidade de abrir um GIF animado enquanto o relatório é gerado.

São muitas páginas e ele costuma demorar um pouco. Usando o JSF eu conseguiria fazer isso com mais facilidade.
Aproveitando a sua atenção, você sabe como eu poderia abrir um página de espera até que o Servlet termine a sua execução ?

Obrigado.

renanpto

E ai, no bean vc pode abrir a janela p fazer o download e ela redirecionar para a url q efetivamente faz o dow… enquanto isso na janela vc exibe o gif… talvez precise de um iframe…

é uma solucao… talvez nao seja a melhor hehehe.

lblanco

Opa,

Vou tentar fazer algo deste tipo.
Muito obrigado pela sua ajuda.

Att

LPJava

dar uma olhada: http://blog.camilolopes.com.br/relatorireportjee/

flw.

lblanco

Opaaaa

Este eu ainda não tinha visto.
Vou olhar e depois posto o resultado.

Obrigado.

Criado 25 de fevereiro de 2011
Ultima resposta 26 de fev. de 2011
Respostas 6
Participantes 3