[Resolvido] iReport + JSF - Relatório não é exibido

Pessoal,

Peguei alguns exemplos na net, inclusive aqui no GUJ sobre como chamar relatórios pdf (jasper) em JSF.
O meu problema é que não dá nenhum erro, mas quando mando gerar o relatório também não acontece nada… já debuguei e passa por todos os processos corretamente, só não apresenta o relatório.

O último teste que fiz foi com esse método (que peguei aqui:http://benignosales.wordpress.com/2011/03/13/jsf-2-0-primefaces-ireport/ :wink: ) :

public void imprimeRelatorio() {

        HashMap parameters = new HashMap();
        parameters.put("nome", "Flavio Andrade");

        try {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.responseComplete();
            ServletContext scontext = (ServletContext) facesContext.getExternalContext().getContext();
            JREmptyDataSource ds = new JREmptyDataSource();
            JasperPrint jasperPrint = JasperFillManager.fillReport(scontext.getRealPath("/WEB-INF/relatorios/historico_com_parametros.jasper"), parameters, ds);
            
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            JRPdfExporter exporter = new JRPdfExporter();
            exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
            exporter.exportReport();
            byte[] bytes = baos.toByteArray();
            
            if (bytes != null && bytes.length > 0) {
                HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
                response.setContentType("application/pdf");
                response.setHeader("Content-disposition", "inline; filename=\"relatorioPorData.pdf\"");
                response.setContentLength(bytes.length);
                ServletOutputStream outputStream = response.getOutputStream();
                outputStream.write(bytes, 0, bytes.length);
                outputStream.flush();
                outputStream.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Meu log do GlassFish após a execução do método é simplesmente nada. :shock:

Alguém saberia me dizer o que pode estar ocorrendo?
Desconfio do meu SO (linux) pode ser? afinal como disse esse não é o primeiro método que pego para fazer isso, e todos os outros aconteceu a mesma coisa.

Prezado Flavio bom dia.

Cara gostaria muito, muito mesmo de poder te ajudar infelizmente estou com um projeto ( didatico ) parado a um tempão na questão de relatorios como vc pode ver aqui no grupo na mensagem
http://www.guj.com.br/java/260699-relatorio-nao-gera#1362855

acho que o meu problema é igual ao seu, tentei muito procurar uma solução inclusive mudando o codigo para se assemelhar as rotinas encontradas nos tutoriais no Blog do Camilo Lopes, Benigno Sales

rlira, agradeço a resposta… agora a pouco descobri uma maneira de se resolver isso, talvez possa te ajudar também…

A questão é que o relatório só é exibido quando ha uma requisição na página (na página por inteira e não Ajax), desta forma, como estou usando um botão primefaces apenas coloquei a propriedade ajax do botão como false.

Espero que te ajude, caso não use primefaces, procure algo no sentido que falei, em fazer um request na página ao pedir para gerar o relatório. 8)

Flavio prezado, no meu projeto uso o Primefaces sim, e chamos o relatorio atraves de um botão rsrsrsrs, cara não tenho tantos conhecimentos no Java assim para poder solucionar o problema eu teria que fazer basicamente o que? se for possivel claro

Pera é so " colocar a propriedade ajax do botão como false. " ? so isto?

exatamente… lá no seu xhtml, o seu botão primefaces possui uma propriedade chamada ajax… é só colocar ela com o valor false, como no exemplo:

<p:commandButton value="Relatorio" id="bnt" actionListener="#{seuBean.geraRelatorio}" ajax="false" />

:smiley: cara hoje chego cedo em casa so pra testar isto, mais antes vou comprar uns rojões

Valeu D+

:smiley:
Dando tudo certo compartilha conosco a notícia, pois eu percebi, enquanto procurava, que muitas pessoas passam por este nosso problema.
Em último caso, se não der certo, tenta utilizar o mesmo método que utilizei (acima), qualquer coisa é só falar.

Prezado Flavio bom dia.

Então meu caro, deu tudo certo, foi apenas incluir a propriedade ajax no botão do primefaces como vc falou,
e o relatorio saiu perfeito ou seja estava tudo certo no relatorio, so não saquei que teria que fazer isto no botão
vc poderia comentar o porque?

Há vou colocar o [Resolvido] na minha mensagem para que outro não passe o que passei

Valeu ai meu prezado.

Que bom que deu tudo certo!

Olha, não saberia te dar uma explicação muito clara, mas…

Os coponentes do primefaces utilizam ajax, para não ter que ficar submetendo a página a cada botão (ou outro componente) que clicamos (além de outros motivos).

Se você reparar no método, colocamos o relatório que criamos no response da pagina e provavelmente (não tenho total certeza) o ajax não remonta o response pelo fato de ele atualizar somente uma parte da página.
Já quando fazemos um request na página (ou seja, quando submetemos uma página) ele remonta todos os componentes da página, inclusive o response e aí ele vê que tem um PDF para apresentar.

Espero que tenha entendido… apesar de eu não ter coseguido ser muito claro :oops: !
Abraços!