Caminho correto do arquivo .jasper

792 views
Skip to first unread message

Chris Allen Barroso

unread,
Oct 29, 2013, 12:34:04 PM10/29/13
to Cejug
Pessoal, já estou dias tentando resolver isso e tentar colocar esse maldito relatório para funcionar e não consigo,
erros e erros.
A final, qual o lugar correto para colocar os aquivos jasper e jrxml?
Eu espalhei pelo meu projeto e nenhum lugar esta pegando
Caused by: java.io.FileNotFoundException: relatorios\usuario.jrxml (O sistema não pode encontrar o caminho especificado)

Veja o anexo e por favor pessoal, me ajudem que isso estão atrasando meu projeto e muito. 


--
Chris Allen Barroso
Analista de Sistemas | Desenvolvedor Java  
Ministério de Planos e Finanças 
@Chravent

jasper.png

Euclides Filizola

unread,
Oct 29, 2013, 12:56:57 PM10/29/13
to ce...@googlegroups.com
Como você está querendo gerar seu relatorio ? sql ? beanDataSource ? O problema não está no local onde você colocou o relatório, e sim como vc está passando pro ireport.  Pelo que vejo, você está querendo passar uma lista de usuarios, e nesse caso, normalmente utiliza-se JRBeanCollectionDataSource.

Outra coisa, pelo que vejo na imagem, você está replicando ele em 3 locais: web pages/relatorios, web pages e source packages. Evite fazer isso, colocando apenas em um único local.


--
Você está recebendo esta mensagem porque se inscreveu no grupo "CEJUG" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para cejug+un...@googlegroups.com.
Para postar neste grupo, envie um e-mail para ce...@googlegroups.com.
Visite este grupo em http://groups.google.com/group/cejug.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.



--
Euclides Filizola

Armando Couto

unread,
Oct 29, 2013, 1:01:36 PM10/29/13
to ce...@googlegroups.com
Boa tarde,

Barroso você deve colocar o relatório na "src/main/resources", resumindo no resources é o melhor local para você colocar, só que eu dentro de resources ainda coloco uma pasta de "relatorios". Então a chamada que eu uso é:

public StreamedContent gerarRelatorioJasper() throws SQLException, NamingException {
InputStream relatorio = null;
try {
InputStream jasperTemplate = this.getClass().getResourceAsStream("/relatorios/teste.jasper");

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

parameters.put("mes", new Date());
parameters.put("imagemSuperior", this.getClass().getResource("/relatorios/imagens/baloes.jpg").getPath());

javax.sql.DataSource ds = InitialContext.doLookup("java:jboss/datasources/testeDS");
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperTemplate, parameters, ds.getConnection());
relatorio = new ByteArrayInputStream(JasperExportManager.exportReportToPdf(jasperPrint));
} catch (JRException ex) {
ex.printStackTrace();
}
return new DefaultStreamedContent(relatorio, "application/pdf", "relatorio_de_aniversantes_do_mes");
}

Efraim Gentil

unread,
Oct 29, 2013, 1:03:10 PM10/29/13
to ce...@googlegroups.com
Chris de uma olhada aqui, acabei de criar um exemplo de como recuperar o arquivo do seu classpath


E segue imagem de onde fica os relatórios.

exemplo.png

Nalomy Souza

unread,
Oct 29, 2013, 1:16:13 PM10/29/13
to ce...@googlegroups.com
Rapaz, vou tentar te ajudar! 

public class ControleRelatorio { // Para pegar o FacesContext private FacesContext facesContext = FacesContext.getCurrentInstance(); /*Retorna o caminho "Path" da Pasta Relatorio! Por padrão coloco uma pasta 'relatorios' dentro de WebContent. */ private String relatorioPath = this.facesContext.getExternalContext() .getRealPath("relatorios") + File.separator; /* Método para Gerar Relatório! *tipoRelatorio: Coloco aqui o mesmo nome que deu no arquivo .jasper ex: teste.jasper *parametro: passo o Hasmap com os parâmetros que usarei no relatório! */ @SuppressWarnings({ "rawtypes", "unchecked" }) public String gerarRelatorio(String tipoRelatorio) { Connection conn = null; JasperPrint jPrint = null; try { //Conexão JDBC conn = ConnectionFactory.getConnectionJDBC(); //Ler o arquivo .Jasper JasperReport jReport = (JasperReport) JRLoader .loadObject(this.relatorioPath + tipoRelatorio + ".jasper"); //não estou colocando parâmetro por isso coloquei 'null' jPrint = JasperFillManager.fillReport(jReport, null, conn); //convert para pdf. JasperExportManager.exportReportToPdfFile(jPrint, this.relatorioPath + "pdf" + File.separator + tipoRelatorio + ".pdf"); File file = new File(this.relatorioPath + "pdf" + File.separator + tipoRelatorio + ".pdf"); file.deleteOnExit(); JasperViewer.viewReport(jPrint, true); Desktop.getDesktop().open(new File(this.relatorioPath + "pdf" + File.separator + tipoRelatorio + ".pdf")); } catch (Exception e) { e.printStackTrace(); try { conn.close(); } catch (SQLException exception) { exception.printStackTrace(); } } finally { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } return null; } }

Ex de Uso:
ControleRelatorio cr = new ControleRelatorio();
cr.gerarRelatorio("relatorioSaidasPeriodo");



Em 29 de outubro de 2013 13:34, Chris Allen Barroso <barros...@hotmail.com> escreveu:

Chris Allen Barroso

unread,
Oct 29, 2013, 1:23:22 PM10/29/13
to Cejug
Gerar um relatório referente ao id que esta sendo passado. 

Quem é esse id? 
Vem da dataTable que faz referencia a que link quero gerar o relatório




--
Chris Allen Barroso
Analista de Sistemas | Desenvolvedor Java  
Ministério de Planos e Finanças 
@Chravent




Date: Tue, 29 Oct 2013 15:03:10 -0200
Subject: Re: [CEJUG] Caminho correto do arquivo .jasper
From: efraim...@gmail.com
To: ce...@googlegroups.com

Euclides Filizola

unread,
Oct 29, 2013, 2:16:50 PM10/29/13
to ce...@googlegroups.com
Chris Allen, 

mano não entendi oq vc quer. Se conseguir explicar melhor, vc quer passar um id de um usuário e trazer um relatório a partir disso, é isso? Explica um pouco melhor, ta confuso.

Chris Allen Barroso

unread,
Oct 29, 2013, 2:19:45 PM10/29/13
to Cejug
Isso Euclides
Eu quero gerar um relatorio aonde a minha clausula que esta no parametro do relatorio é: 
select * from usu_usuario where usu_id = $P{usuario} 




--
Chris Allen Barroso
Analista de Sistemas | Desenvolvedor Java  
Ministério de Planos e Finanças 
@Chravent




Date: Tue, 29 Oct 2013 16:16:50 -0200

Subject: Re: [CEJUG] Caminho correto do arquivo .jasper

Chris Allen Barroso

unread,
Oct 29, 2013, 2:30:04 PM10/29/13
to Cejug
Armando, fiz as alterações sugeridas mas não surtiram efeitos. 
Veja como esta. 



 public StreamedContent relaUsuario(Integer id) throws FileNotFoundException, SQLException, JRException, IOException {
        InputStream relatorio = null;
        Session sessao = HibernateUtil.getSessionFactory().openSession();
        try {
            System.out.println("Gerando relatório...");
            InputStream jasperTemplate = this.getClass().getResourceAsStream("/../../relatorios/usuario.jasper");
            usuarioDao usuDao = new usuarioDaoImp();
            usuUsuario = usuDao.buscaPorId(id);
            parametros.put("usuario", usuUsuario.getUsuId());
            parametros.put(JRHibernateQueryExecuterFactory.PARAMETER_HIBERNATE_SESSION, sessao);

            JasperPrint print = JasperFillManager.fillReport(jasperTemplate, parametros);
            relatorio = new ByteArrayInputStream(JasperExportManager.exportReportToPdf(print));
            System.out.println("Relatorio gerado");

        } catch (JRException ex) {
            ex.printStackTrace();
        }
        return new DefaultStreamedContent(relatorio, "application/pdf", "usuario");
    }

--
Chris Allen Barroso
Analista de Sistemas | Desenvolvedor Java  
Ministério de Planos e Finanças 
@Chravent




From: barros...@hotmail.com
To: ce...@googlegroups.com
Subject: RE: [CEJUG] Caminho correto do arquivo .jasper
Date: Tue, 29 Oct 2013 18:19:45 +0000

Euclides Filizola

unread,
Oct 29, 2013, 2:34:58 PM10/29/13
to ce...@googlegroups.com
Chris Allen, vamos lá. 

Se você estiver utilizando JSF, vou tentar te ajudar e vê se isso vai funcionar. Como eu não estou vendo seu código abaixo da linha do jasper, suponho que você já esteja renderizando ele para jogar na tela, ou como arquivo de download.

Então do jeito que seu código está, adiciona isso e vê se melhora:


Map parametros = new HashMap();

HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
String caminhoRelatorio = session.getServletContext().getRealPath("/relatorios/usuario.jrxml");

JasperReport pathjrxml = JasperCompileManager.compileReport(caminhoRelatorio);

..

Se isso não funcionar, favor postar o método inteiro para um melhor entendimento. E se você não estiver utilizando jsf, favor dizer qual tecnologia está utilizando e se é um action-based ou component-based.



Att,


Chris Allen Barroso

unread,
Oct 29, 2013, 2:49:53 PM10/29/13
to Cejug
Euclides, obrigado pelo retorno.
Estou usando sim o JSF2.0

a minha classe com o metodo:

@ManagedBean(name = "relatorioBean")
@RequestScoped
//@ViewScoped
public class RelatorioBean {

    private UsuUsuario usuUsuario;
    private Map<String, Object> parametros = new HashMap<>();
    static SessionFactory session = HibernateUtil.getSessionFactory();
    private FacesContext facesContext = FacesContext.getCurrentInstance();

    public RelatorioBean() {
        this.usuUsuario = new UsuUsuario();

    }

    public StreamedContent relaUsuario(Integer id) throws FileNotFoundException, SQLException, JRException, IOException {
        InputStream relatorio = null;
        try {
            System.out.println("Gerando relatório...");
            usuarioDao usuDao = new usuarioDaoImp();
            usuUsuario = usuDao.buscaPorId(id);
            parametros.put("usuario", usuUsuario.getUsuId());
            HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
            String caminhoRelatorio = session.getServletContext().getRealPath("/relatorios/usuario.jrxml");
            JasperReport pathjrxml = JasperCompileManager.compileReport(caminhoRelatorio);
            JasperPrint print = JasperFillManager.fillReport(pathjrxml, parametros);
            relatorio = new ByteArrayInputStream(JasperExportManager.exportReportToPdf(print));
            System.out.println("Relatorio gerado");

        } catch (JRException ex) {
            ex.printStackTrace();
        }
        return new DefaultStreamedContent(relatorio, "application/pdf", "usuario");
    }
}


Agora esta dando erro aqui:
JasperReport pathjrxml = JasperCompileManager.compileReport(caminhoRelatorio);


 symbol:   class JRFillVariable
  location: class report32name_1383072561508_255451
73 errors
at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompil
SEVERE: er.java:204)
at net.sf.jasperreports.engine.JasperCompileManager.compile(JasperCompileManager.java:241)
at net.sf.jasperreports.engine.JasperCompileManager.compile(JasperCompileManager.java:174)
at net.sf.jasperreports.engine.JasperCompileManager.compileReport(JasperCompileManager.java:459)
at beans.RelatorioBean.relaUsuario(RelatorioBean.java:60)





--
Chris Allen Barroso
Analista de Sistemas | Desenvolvedor Java  
Ministério de Planos e Finanças 
@Chravent




Date: Tue, 29 Oct 2013 16:34:58 -0200

Euclides Filizola

unread,
Oct 29, 2013, 2:59:46 PM10/29/13
to ce...@googlegroups.com
faz dessa,

essa linha:

 String caminhoRelatorio = session.getServletContext().getRealPath("/relatorios/usuario.jrxml");

troca por esta:

 String caminhoRelatorio = session.getServletContext().getRealPath("/relatorios/usuario.jasper");


Chris Allen Barroso

unread,
Oct 29, 2013, 3:18:55 PM10/29/13
to Cejug
SEVERE: Caused by: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.



--
Chris Allen Barroso
Analista de Sistemas | Desenvolvedor Java  
Ministério de Planos e Finanças 
@Chravent




Date: Tue, 29 Oct 2013 16:59:46 -0200

Pablo Nóbrega

unread,
Oct 29, 2013, 3:45:31 PM10/29/13
to ce...@googlegroups.com
Chris,

Se você já tem o arquivo .jasper, não é preciso compilar o .jrxml. Neste caso, tire a linha 

JasperReport pathjrxml = JasperCompileManager.compileReport(caminhoRelatorio);

e coloque o trecho abaixo nos locais corretos:

 String caminhoRelatorio = session.getServletContext().getRealPath("/relatorios/usuario.jasper");
 JasperPrint print = JasperFillManager.fillReport(caminhoRelatorio, parametros);

Não estou vendo também você passar a Connection ou a Session para o JasperReport gerar o relatório.

Atenciosamente,

Pablo Nóbrega
Mestre em Computação - UECE
Analista de Requisitos Sefin
http://pablonobrega.wordpress.com
pablo....@sefin.fortaleza.ce.gov.br

Chris Allen Barroso

unread,
Oct 29, 2013, 3:54:45 PM10/29/13
to Cejug
Pablo com a alteração sugerida, da o seguinte erro:
WARNING: The supplied java.sql.Connection object is null.
Como eu passo neste caso a conexão hibernate


--
Chris Allen Barroso
Analista de Sistemas | Desenvolvedor Java  
Ministério de Planos e Finanças 
@Chravent




Date: Tue, 29 Oct 2013 17:45:31 -0200

Subject: Re: [CEJUG] Caminho correto do arquivo .jasper

Pablo Nóbrega

unread,
Oct 29, 2013, 4:04:09 PM10/29/13
to ce...@googlegroups.com
Qual a versão do Hibernate?

Se for 3, tenta assim:

Connection conn = session.connection();

Está deprecated, mas serve pelo menos para vc testar provisoriamente. Se quiser fazer de uma forma elegante ou seu Hibernate for o 4, pode usar Inner Classes como o exemplo a seguir: 

session.doWork(new Work() {
    @Override
    public void execute(Connection connection) throws SQLException {
        // pronto. posso usar a conexão
    }
});

Agora na chamada do relatório faça assim:

JasperPrint print = JasperFillManager.fillReport(caminhoRelatorio, parametros, connection);

Atenciosamente,

Pablo Nóbrega
Mestre em Computação - UECE
Analista de Requisitos Sefin
http://pablonobrega.wordpress.com
pablo....@sefin.fortaleza.ce.gov.br


Chris Allen Barroso

unread,
Oct 29, 2013, 4:14:46 PM10/29/13
to Cejug
Estou usando o 3.
mas mesmo isso eu já havia tentando.
Connection conn = session.connection();
Importo qual?
Eu já testei 1 a 1 e o .connection(); sempre da erro.


--
Chris Allen Barroso
Analista de Sistemas | Desenvolvedor Java  
Ministério de Planos e Finanças 
@Chravent




Date: Tue, 29 Oct 2013 18:04:09 -0200
ateste.png

Chris Allen Barroso

unread,
Oct 29, 2013, 4:20:55 PM10/29/13
to Cejug
Estou usando o 3.
mas mesmo isso eu já havia tentando.
Connection conn = session.connection();
Importo qual?
Eu já testei 1 a 1 e o .connection(); sempre da erro.


--
Chris Allen Barroso
Analista de Sistemas | Desenvolvedor Java  
Ministério de Planos e Finanças 
@Chravent




Date: Tue, 29 Oct 2013 18:04:09 -0200
ateste.png

Chris Allen Barroso

unread,
Oct 29, 2013, 4:22:08 PM10/29/13
to Cejug
Estou usando o 3.
mas mesmo isso eu já havia tentando.
Connection conn = session.connection();
Importo qual?
Eu já testei 1 a 1 e o .connection(); sempre da erro.


--
Chris Allen Barroso
Analista de Sistemas | Desenvolvedor Java  
Ministério de Planos e Finanças 
@Chravent




Date: Tue, 29 Oct 2013 18:04:09 -0200
ateste.png

Chris Allen Barroso

unread,
Oct 29, 2013, 5:40:58 PM10/29/13
to Cejug
Fiz mais algumas alterações sugeridas porem outros erros.

 public void relaUsuario(Integer id) throws FileNotFoundException, SQLException, JRException, IOException {
        InputStream relatorio = null;
        Connection conn = null;

        Session session3 = HibernateUtil.getSessionFactory()
                .getCurrentSession();
        session3.beginTransaction();
        conn = session3.connection();

        try {
            System.out.println("Gerando relatório...");
            usuarioDao usuDao = new usuarioDaoImp();
            usuUsuario = usuDao.buscaPorId(id);
            parametros.put("usuario", usuUsuario.getUsuId());
            HttpSession session2 = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
            String caminhoRelatorio = session2.getServletContext().getRealPath("/relatorios/usuario.jasper");
            JasperPrint print = JasperFillManager.fillReport(caminhoRelatorio, parametros,conn);
            relatorio = new ByteArrayInputStream(JasperExportManager.exportReportToPdf(print));

            System.out.println("Relatorio gerado");

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

Desta forma não dava nenhum erro porem não mostrava se gerava ou não o pdf.
então add a seguinte linha para exibir o arquivo
            JasperViewer.viewReport(relatorio,true); 
porem esta dando esse erro:
Caused by: java.awt.HeadlessException


--
Chris Allen Barroso
Analista de Sistemas | Desenvolvedor Java  
Ministério de Planos e Finanças 
@Chravent




From: barros...@hotmail.com
To: ce...@googlegroups.com
Subject: RE: [CEJUG] Caminho correto do arquivo .jasper
Date: Tue, 29 Oct 2013 20:22:08 +0000

Pablo Nóbrega

unread,
Oct 29, 2013, 8:17:46 PM10/29/13
to ce...@googlegroups.com
O erro da classe JasperViewer é que ela deve ser usada se for uma aplicação desktop, que não é o caso.

Em relação ao problema de exibição do relatório, o erro está na lógica de exibir o PDF via JSF2. Faz assim: esse método está no seu ManagedBean e é chamado por um commandButton? Se estiver, após obter o JasperPrint, coloca o seguinte:

HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
httpServletResponse.addHeader("Content-disposition", "attachment; filename=report.pdf");
ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
JasperExportManager.exportReportToPdfStream(print, servletOutputStream);
FacesContext.getCurrentInstance().responseComplete();

E não esquece de tirar as linhas:

relatorio = new ByteArrayInputStream(JasperExportManager.exportReportToPdf(print));
System.out.println("Relatorio gerado");

Só mais um detalhe: a requisição do commandButton não pode ser ajax, portanto, dependendo do framework RIA que você estiver usando, pode ser necessário colocar o atributo ajax="false".

Atenciosamente,

Pablo Nóbrega
Mestre em Computação - UECE
Analista de Requisitos Sefin
http://pablonobrega.wordpress.com
pablo....@sefin.fortaleza.ce.gov.br


Chris Allen Barroso

unread,
Oct 30, 2013, 4:22:18 AM10/30/13
to Cejug
Valeu Pablo.
Finalmente funcionando.
Tive que colocar sim o ajax="false".

Obrigado a todos que ajudaram. Assim vou seguindo aprendendo. 
 
Ficou assim:
 public void relaUsuario(Integer id) throws FileNotFoundException, SQLException, JRException, IOException {
        InputStream relatorio = null;
        Connection conn = null;

        Session session3 = HibernateUtil.getSessionFactory()
                .getCurrentSession();
        session3.beginTransaction();
        conn = session3.connection();

        try {
            System.out.println("Gerando relatório...");
            usuarioDao usuDao = new usuarioDaoImp();
            usuUsuario = usuDao.buscaPorId(id);
            parametros.put("usuario", usuUsuario.getUsuId());
            HttpSession session2 = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
            String caminhoRelatorio = session2.getServletContext().getRealPath("/relatorios/usuario.jasper");
            JasperPrint print = JasperFillManager.fillReport(caminhoRelatorio, parametros, conn);
            HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
            httpServletResponse.addHeader("Content-disposition", "attachment; filename=usuario.pdf");
            ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
            JasperExportManager.exportReportToPdfStream(print, servletOutputStream);
            FacesContext.getCurrentInstance().responseComplete();

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



--
Chris Allen Barroso
Analista de Sistemas | Desenvolvedor Java  
Ministério de Planos e Finanças 
@Chravent




Date: Tue, 29 Oct 2013 22:17:46 -0200

Subject: Re: [CEJUG] Caminho correto do arquivo .jasper
Reply all
Reply to author
Forward
0 new messages