Abrir Relatório no Browser/Navegador JSF/iReport

312 views
Skip to first unread message

Anderson Matos

unread,
Dec 28, 2015, 8:00:33 AM12/28/15
to javasf: JavaServer Faces Group
Bom dia pessoal!
Acho que o problema seja simples de resolver, mas estou precisando da ajuda de vocês.
O método que é responsável por gerar e mostrar o relatório no navegador é executado sem erros no console, porém o relatório não é exibido. O que pode ser?
Segue abaixo o método:

public void executarRelatorioBrowser(Map<String, Object> parametros) throws IOException, JRException, ClassNotFoundException, SQLException {
FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
ServletOutputStream responseStream = response.getOutputStream();
 
response.setContentType("application/pdf");
response.setHeader("Content-Disposition","attachment;  filename=\"relatorio.pdf\"");
response.setHeader("Pragma","");
response.setHeader("Cache-Control","");
response.setHeader("Expires",""); 
InputStream reportStream = context.getExternalContext().getResourceAsStream("/relatorios/laudo.jasper");
JasperRunManager.runReportToPdfStream(reportStream, responseStream, parametros, getConexao());
responseStream.flush();
responseStream.close();
context.responseComplete();
getConexao().close();
}

PS: Não é necessário/interessante para mim gerar o arquivo .pdf físico.
Desde já, agradeço a ajuda de vocês, Obrigado!

Arthur Gregório

unread,
Dec 28, 2015, 8:06:09 AM12/28/15
to jav...@googlegroups.com

Arthur P. Gregório
+55 45 9958-0302
@gregorioarthur
www.arthurgregorio.eti.br

--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/javasf.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/javasf/ab73e818-2b42-44cb-a09b-c012197af2be%40googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Rafael Ponte

unread,
Dec 28, 2015, 8:55:45 AM12/28/15
to jav...@googlegroups.com
Olá,

A classe no Arthur vai te ajudar muito, pois ela está bem simples de entender e o melhor, reutilizável. De qualquer forma, recomendo entender como o servidor envia arquivos para o navegador.

Outro detalhe importante é que seu evento da página NÃO pode ser AJAX. Ele precisa ser um submit comum de formulário ou um link (GET).

Um abraço!


Para mais opções, acesse https://groups.google.com/d/optout.
--
Rafael Ponte
TriadWorks | Formação Java
http://cursos.triadworks.com.br

Anderson Matos

unread,
Dec 28, 2015, 8:57:16 AM12/28/15
to javasf: JavaServer Faces Group
Ok Arthur.
Segui seu exemplo, mas infelizmente está ocorrendo um erro. Tem ideia do que possa ser?
ERRO:

Dez 28, 2015 10:51:59 AM com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
GRAVE: Error Rendering View[/security/visualizarExame.xhtml]
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:678)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:213)
at com.sun.faces.context.ExternalContextImpl.getResponseOutputWriter(ExternalContextImpl.java:723)
at javax.faces.context.ExternalContextWrapper.getResponseOutputWriter(ExternalContextWrapper.java:669)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.createResponseWriter(FaceletViewHandlingStrategy.java:881)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:374)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
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:509)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at br.gov.ce.ipc.labipc.filter.LoginFilter.doFilter(LoginFilter.java:55)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)

java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:678)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:213)
at com.sun.faces.context.ExternalContextImpl.getResponseOutputWriter(ExternalContextImpl.java:723)
at javax.faces.context.ExternalContextWrapper.getResponseOutputWriter(ExternalContextWrapper.java:669)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.createResponseWriter(FaceletViewHandlingStrategy.java:881)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:374)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
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:509)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at br.gov.ce.ipc.labipc.filter.LoginFilter.doFilter(LoginFilter.java:55)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Dez 28, 2015 10:51:59 AM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/labipc] threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:678)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:213)
at com.sun.faces.context.ExternalContextImpl.getResponseOutputWriter(ExternalContextImpl.java:723)
at com.sun.faces.context.PartialViewContextImpl.createPartialResponseWriter(PartialViewContextImpl.java:423)
at com.sun.faces.context.PartialViewContextImpl.access$300(PartialViewContextImpl.java:72)
at com.sun.faces.context.PartialViewContextImpl$DelayedInitPartialResponseWriter.getWrapped(PartialViewContextImpl.java:561)
at javax.faces.context.PartialResponseWriter.startDocument(PartialResponseWriter.java:115)
at org.primefaces.context.PrimePartialResponseWriter.startDocument(PrimePartialResponseWriter.java:146)
at com.sun.faces.context.AjaxExceptionHandlerImpl.handlePartialResponseError(AjaxExceptionHandlerImpl.java:199)
at com.sun.faces.context.AjaxExceptionHandlerImpl.handle(AjaxExceptionHandlerImpl.java:123)
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:509)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at br.gov.ce.ipc.labipc.filter.LoginFilter.doFilter(LoginFilter.java:55)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)

Arthur Gregório

unread,
Dec 28, 2015, 9:01:03 AM12/28/15
to jav...@googlegroups.com
O Rafael comentou algo ali que tinha esquecido de falar, não esqueça que não pode ser Ajax!

Mas sobre esse problema, tive ele mas nem lembro o que fiz para resolver! hahaahhah 

Mas verifica primeiro de tudo, se não esta fazendo isso dentro de alguma chamada Ajax.

Arthur P. Gregório
+55 45 9958-0302
@gregorioarthur
www.arthurgregorio.eti.br

Rafael Ponte

unread,
Dec 28, 2015, 9:04:33 AM12/28/15
to jav...@googlegroups.com
Olá,

Esse problema ocorre quando algum filtro ou componente já escreveu no response antes de chegar no seu método. Qual a versão do JSF você está utilizando?


Para mais opções, acesse https://groups.google.com/d/optout.
--

Anderson Matos

unread,
Dec 28, 2015, 9:10:59 AM12/28/15
to javasf: JavaServer Faces Group
Ótima observação RPonte! Bastou eu colocar uma ajax="false" no p:commandButton e tudo deu certo.
Arthur, vlw irmão, como o RPonte citou, sua classe está bem simples!
Obrigado aos dois. Vlws!!!

Everton Fujimoto

unread,
Dec 28, 2015, 1:05:17 PM12/28/15
to jav...@googlegroups.com

Sobre o erro, provavelmente ainda está dando no log.. no envio do pdf chama um método que deve ser mais ou menos FacesContext.getInstance ().isRequestComplete ().

--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/javasf.

Anderson Matos

unread,
Dec 28, 2015, 1:23:03 PM12/28/15
to javasf: JavaServer Faces Group
Realmente está sim Fujimoto, mas notei que acontece quando, por exemplo:
Acabei de startar a aplicação vou lá e gero o relatório e tals. Blz, gerou bonitinho, console limpo de erros e tals.
Daí se eu for lá e gerar pela 2ª vez, ele gera o relatório normal só que com erro no console. Tem ideia do que possa ser?
Segue aqui o método:


public void executarRelatorioBrowser(Map<String, Object> parametros) throws IOException, JRException, ClassNotFoundException, SQLException {
FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
        
        externalContext.responseReset();
        externalContext.setResponseContentType("application/pdf");
        
String report = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/relatorios/laudo.jasper");
JasperPrint jasperPrint = JasperFillManager.fillReport(report, parametros, getConexao());

        JRPdfExporter exporter = new JRPdfExporter();
       
        exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
        exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(response.getOutputStream()));
        exporter.exportReport();
        
        
        getConexao().close();
        response.getOutputStream().flush();
        response.getOutputStream().close();
Reply all
Reply to author
Forward
0 new messages