Briga com IReport

18 respostas
R

Galera!!..

Tudo bem?!!..

Estou em uma briga danada com o IReport. Estou tentando atravez do J2EE executar o IReport para gerar meus relatorios. O problema é que ele nunca acha o arquivo .jasper. Ja coloquei o arquivo em tds as pastas possiveis.

Projeto
WebContent
WEB-INF
Classes

Mais ele nunca acha. Fiz o teste com um main e ele executou perfeitamente, não sei c esso erro acontece por eu estar usando packages em minhas classes.

Alguem sabe o loca certo para eu colocar os arquivos .jasper?

Valeu galera…fiquem com Deus

18 Respostas

R

Galera, dando uma procurada eu vi q o problema eh em relação ao caminho do arquivo. Fiz um teste e vi q c eu coloca no C:\x.jasper da certo.

Entaum como eu pego o caminho da minha aplicação dinamicamente no servidor? pq quando eu coloco so o nome do arquivo para ele procurar ele esta c perdendo por não saber aonde procurar.

Valeu galera

andrik

Olá rickab7, a interface ServletContext possui um método chamado getRealPath onde você passa o caminho relativo de um arquivo e ele te retorna o caminho absoluto.

http://java.sun.com/javaee/5/docs/api/javax/servlet/ServletContext.html#getRealPath(java.lang.String)

[]'s

Andrik Albuquerque

R

Entaum cara, tudo bem?!..

Ja tentei usar ela, mais so me retorna null

Não sei pq isso acontece

andrik

Olá rickab7,

você poderia postar a parte do código que você está usando para recuperar o caminho?

[]'s

Andrik Albuquerque

R

Segue o codigo

package br.plano.compra.servlet;

import java.io.IOException;
import java.sql.Connection;
import java.util.HashMap;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.swing.JOptionPane;

import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;

import br.plano.compra.bean.PlanoCompra;
import br.plano.compra.configuracao.ConfigUsuario;
import br.plano.compra.dao.DAO;
import br.plano.compra.relatorio.RelPlanoCompraHosp;

/**
 * Servlet implementation class for Servlet: Control_RelPlanoCompraHosp
 *
 */
 public class Control_RelPlanoCompraHosp extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
   static final long serialVersionUID = 1L;
   private ConfigUsuario configUsuario;
   private HttpSession sessao;
   private PlanoCompra planoCompra;
   private RelPlanoCompraHosp rel;
   
   /* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#HttpServlet()
	 */
	public Control_RelPlanoCompraHosp() {
		super();
	}   	
	
	/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		try {  
			Connection con = new DAO().Conecta(); 
	         JasperPrint rel = null;  
	         String arquivoJasper;  
	                      
	         HashMap map = new HashMap(); 
	         map.put("CD_PLANO_COMPRA", 99);
	              
	        arquivoJasper = getServletContext().getRealPath("/Relatorio/Rel_PlanoCompraHosp.jasper");  
	        rel = JasperFillManager.fillReport(arquivoJasper, map, con);
	        rel.setName("Relatorio Plano de Compras Hospital");
	        JasperViewer.viewReport(rel, false);             
	          
	        } catch (Exception e) {  
	            System.out.println(e.getMessage());  
	        }
	}  	
	
	/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	} 
	
	public void Sessao(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		configUsuario = new ConfigUsuario();
		configUsuario.Sessao(request, response);
	}
}

Mais o caminho so me retorna null.

A pasta relatorio esta dentro da pasta WebContent.

Valeu pela ajuda.

R

Alguem pode me dar uma ajuda???!!

furutani

Olá

O path /Relatorio/Rel_PlanoCompraHosp.jasper está certo? respeita maiuscula e minuscula?

V

rickab7

Por que vc não cria um pacote dentro do src.
Ex: br.plano.compra.relatorio

arquivoJasper = “/WEB-INF/br/plano/compra/relatorio/relatorio.jasper”;

Se nao conseguir me manda um mp que mando um exemplo.

R

Ola pessoal…

Ja tentei e o caminho esta certo, respeitando maiusculo e menusculo.

Irei aceitar o exemplo, ja estou com dor de cabeça com isso…rsrs

Valeu

V

Cara esqueci do classes.
Abaixo funciona.

arquivoJasper = “/WEB-INF/classes/br/plano/compra/relatorio/relatorio.jasper”;

R

VM…

Eu tinha observado isso…mais não ta dando certo.

Cara, chega estou desanimado…rsrs

Agora, se eu colocar na string diretamente D:/Projeto/planocompra/… isso da certo, pq?

V

Vc colocou o jasper no pacote que vc criou?

Este he o metodo que tenho rodando.

public String actionRelatorio() {

try {

//criar um Map com os parametros, como o título. Se não tiver parametros, criar um Map vazio

Map parameters = new HashMap();

parameters.put(Title, Lista de Estados);

//criar um objeto ServletOutputStream com base no response

FacesContext context = FacesContext.getCurrentInstance();

HttpServletResponse response = (HttpServletResponse) context

.getExternalContext().getResponse();

ServletOutputStream servletOutputStream = response

.getOutputStream();

//Criar um InputStream a partir do arquivo fonte do relatório

InputStream reportStream = context.getExternalContext()

.getResourceAsStream("/WEB-NF/classes/Util/ireport/teste.jasper");

/**

* Este comando criará o pdf e o colocará diretamente noobjeto response

* É necessário um InputStream, ServletOutputStream, um Map (pode ser new HashMap) e um objeto que extende JRDataSource

*/

JasperRunManager.runReportToPdfStream(reportStream,

servletOutputStream, parameters, ds);

} catch (Exception e) {

e.printStackTrace();

}

return null;

}
R

Ola!

Cara, la no InputStream o metodo getExternalContext() ta dando erro, como se ele não existise na interface Context

V

Olá,

Eu também tive problemas com o jasper para ele encontrar o arquivo através de um caminho relativo, mas resolvi o problema do caminho realitvo utilizando o seguinte método do ClassLoader:
ClassLoader.getSystemResourceAsStream(“relatorio.jasper”);

Se você tem o arquivo jasper dentro de um pacote, basta coloca o nome do pacote antes:
ClassLoader.getSystemResourceAsStream("/relatorio.jasper");

Nunca coloque a barra no início do caminho, senão o arquivo não é encontrado.
Este método retorna um InputStream e pode ser usado com o fillManager do jasperreports.

Espero ter ajudado.

M

Opa, acho que isso tem a ver como você está pegando o caminho!!

R

Cara, tudo bem?!!..

Assim como o getRealPath, este que você me mostrou está me trazendo null?

Pq será?

R

Cara, tudo bem??!!

Não deu certo, ta trazendo null. você sabe pq?

Kleber-rr

EAe pessoal, blz??

Sei que o post é antigão, mas to nessa briga feia de faca tb... hhehee

o meu problema é que meu método não funciona. Todos os outros métodos do bean funcionam, menos essa carniça... hehehe
public class OrgaoGestorHandler {

	private String saida;
	private List<OrgaoGestor> listOg;

//...
	// MÉTODOS PARA IMPRIMIR RELATÓRIO
	private String getDiretorioReal(String diretorio) {
		HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
				.getExternalContext().getSession(false);
		System.out.println("getDireitorioReal");
		return session.getServletContext().getRealPath(diretorio);
	}

	private String getContextPath() {
		HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
				.getExternalContext().getSession(false);
		System.out.println("getContextPath");
		return session.getServletContext().getContextPath();
	}

	private void preenchePdf(JasperPrint print) throws JRException {
		// Pego o caminho completo do PDF desde a raiz
		saida = getDiretorioReal("/pdf/relatorio.pdf");
		// Exporto para PDF
		JasperExportManager.exportReportToPdfFile(print, saida);
		/*
		 * Jogo na vari�vel sa�da o nome da aplica��o mais o caminho para o PDF.
		 * Essa vari�vel ser� utilizada pela view
		 */
		saida = getContextPath() + "/pdf/relatorio.pdf";
	}

	public String imprimirRelatorio() { //ESSA É A CARNIÇA...
		System.out.println("metodo de impressao");
		saida = null;
		String jasper = getDiretorioReal("jasper/orgaogestor.jasper");
		JRDataSource jrds = new JRBeanCollectionDataSource(listOg);
		// Connection conexao = null;
		try {
			// Mando o jasper gerar o relat�rio
			JasperPrint print = JasperFillManager
					.fillReport(jasper, null, jrds);
			// Gero o PDF
			preenchePdf(print);
			System.out.println("pdf gerado");

		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("erro: " + e);
	
		}
	
		return "exibeRelatorio";

	}
no meu jsp, está assim:
<rich:dataTable value="#{orgaogestorHandler.orgaosGestoresByNome}" var="f" rendered="#{not empty orgaogestorHandler.orgaosGestoresByNome}" rows="5" id="orgaosGestoresByNome">
		<h:column>
			<f:facet name="header">
				<h:outputText value="Código"/>
			</f:facet>
				<h:outputText value="#{f.cod_orgaogestor}"/>
		</h:column>
		<h:column>
			<f:facet name="header">
				<h:outputText value="Nome"/>
			</f:facet>
				<h:outputText value="#{f.nome}"/>		
		</h:column>

		<h:column>
			<f:facet name="header">
				<h:outputText value="Relatório"/>
			</f:facet>
			<center>
			<h:commandButton value="PDF" target="_blank" action="#{orgaogestorHandler.imprimirRelatorio}"/>//NÃO FUNCIONA NEM COM REZA BRABA....
								
		</center>
		</h:column>

Eae pessoal, alguem pode me ajudar???

Valeu.

Criado 22 de outubro de 2007
Ultima resposta 28 de jun. de 2010
Respostas 18
Participantes 7