1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Problema em exportar Relatório com JasperReport JSF e PrimeFaces

Estava fazendo um curso e estou com um problema em exportar meu relatorio, ele executa todo o metódo normal sem apresentar nenhum erro, mas no final não gera o pdf para o download. Debuguei e ele chega até o criar o objeto do JasperPrint

minha pagina

<ui:composition template="/WEB-INF/template/layoutPadrao.xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

    <ui:define name="titulo">Relatórios de Vendas</ui:define>

    <ui:define name="corpo">
        <h:form id = "frm" target="_blank">
            <h1>Relatório de Vendas</h1>

            <p:toolbar style="margin-top: 20px">
                <p:toolbarGroup>
                    <p:commandButton value="Produtos"
                        action="#{relatorioProdutoBean.emitir()}" />
                    <p:commandButton value="Produtos em Baixa quantidade"
                        action="#{relatorioVendasBean.emitir()}" />
                </p:toolbarGroup>
            </p:toolbar>
        </h:form>
    </ui:define>
</ui:composition>

meu Bean

package com.grupoCasa.estoqueVenda.controller;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

import javax.enterprise.context.RequestScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletResponse;

import org.hibernate.Session;

import com.grupoCasa.estoqueVenda.util.report.ExecutorRelatorioProduto;

@Named
@ViewScoped
public class RelatorioProdutoBean implements Serializable{

    private static final long serialVersionUID = 1L;

    @Inject
    private FacesContext facesContext;

    @Inject
    private HttpServletResponse response;

    @Inject
    private EntityManager manager;


    public void emitir(){

        Map<String, Object> parametros = new HashMap<String, Object> ();

        ExecutorRelatorioProduto executor = new ExecutorRelatorioProduto("/relatorios/relatorio_produtos.jasper",
                this.response, parametros, "Relatório Produtos.pdf");


        Session session = manager.unwrap(Session.class);
        session.doWork(executor);

        facesContext.responseComplete();
    }
}

a classe que executa o relatório, estou a interface Work para passar a conexão do Banco.

package com.grupoCasa.estoqueVenda.util.report;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Locale;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.JRPdfExporter;

import org.hibernate.jdbc.Work;

public class ExecutorRelatorioProduto implements Work {

    private String caminhoRelatorio;
    private HttpServletResponse response;
    private Map<String, Object> parametros;
    private String nomeArquivoSaida;

    private boolean relatorioGerado;

    public ExecutorRelatorioProduto(String caminhoRelatorio,
            HttpServletResponse response, Map<String, Object> parametros,
            String nomeArquivoSaida) {
        this.caminhoRelatorio = caminhoRelatorio;
        this.response = response;
        this.parametros = parametros;
        this.nomeArquivoSaida = nomeArquivoSaida;

        this.parametros.put(JRParameter.REPORT_LOCALE, new Locale("pt", "BR"));
    }

    @Override
    public void execute(Connection connection) throws SQLException {
        try {
            InputStream relatorioStream = this.getClass().getResourceAsStream(
                    this.caminhoRelatorio);

            JasperPrint print = JasperFillManager.fillReport(relatorioStream,
                    this.parametros, connection);
            this.relatorioGerado = print.getPages().size() > 0;

            System.out.println(print.getPages().size());

            if (this.relatorioGerado) {

                response.setContentType("application/pdf");
                response.setHeader("Content-Disposition", "attachment; filename=\"" 
                        + this.nomeArquivoSaida  + "\"");

                JasperExportManager.exportReportToPdfStream(print, response.getOutputStream());
            }
        } catch (Exception e) {
            throw new SQLException("Erro ao executar relatório "
                    + this.caminhoRelatorio, e);
        }
    }
  • Chega a apresentar algum erro? Ele gera o pdf na pasta que você indicou?

    Sophie Vergueiro   22 de out de 2015
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags jsf primefaces ireport cdi jpa hibernate ou faça a sua própria pergunta.