[Resolvido] Conexão Hibernate com IReport + VRaptor 3

48 respostas
Guevara

Oi pessoal!
Estou com um probleminha no ireport usando conexão Hibernate, assim está o meu hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<property name="connection.url">jdbc:postgresql://localhost/imobiliaria</property>
		<property name="connection.driver_class">org.postgresql.Driver</property>
		<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>	
		<property name="connection.username">user</property>
		<property name="connection.password">123456</property>				
		<property name="connection.pool_size">1</property>
		<property name="current_session_context_class">thread</property>
		<property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
		<property name="hibernate.hbm2ddl.auto">update</property>		
		<mapping class="br.com.imobiliaria.bean.Contato"/>
		<mapping class="br.com.imobiliaria.bean.Imovel"/>
		<mapping class="br.com.imobiliaria.bean.Proprietario"/>
		<mapping class="br.com.imobiliaria.bean.Foto"/>
		<mapping class="br.com.imobiliaria.bean.Pedido"/>
		<mapping class="br.com.imobiliaria.bean.Usuario"/>					
	</session-factory>
</hibernate-configuration>

Mas aparece esta tela:


Nas minhas pesquisas não achei alguma resposta pra isso. =/

Outras dúvidas:
O ireport não é capaz de usar o hibernate.properties pra isso? Preciso mesmo do hibernate.cfg.xml pra essa conexão?
O que eu fiz até agora foi colocar na /lib do ireport o jar do hibernate e do postgre, coloquei no classpath do ireport a /src do projeto, seguindo esta dica aqui:
http://www.guj.com.br/posts/list/120240.java

O autor disse que resolveu desta forma:

Só que estou em aplicação web.
Como posso resolver isso?
Abraço!!

48 Respostas

Lucas_Cavalcanti

essa classe existe?
br.com.imobiliaria.bean.Contato

o pacote tá correto?

Guevara

Oi Lucas!
Está sim, veja:

Estranho né?

Lucas_Cavalcanti

tem que ver se essas classes estão no classpath mesmo…

rodando fora do iReport funciona?

Guevara

O que eu fiz foi importar pro classpath do ireport a pasta /src do meu projeto. Não é assim que funciona?

Guevara

Acho que vou baixar o ireport 3.7.4, tô usando o 3.7.3.

De repente é bug, talvez na versão mais nova a interface tb tenha passado por manutenção, pq o menú cada hora aparece num lugar diferente na IDE.

Lucas_Cavalcanti

tenta linkar pro projeto inteiro…

senão, tenta linkar pra pasta bin (onde estão os .class)

Guevara

Apontei pro projeto todo e para Imobiliaria/src/br/com/imobiliaria, não deu boa. Mas teria que ser a /src mesmo, pq lá está o hibernate.cfg.xml. =/

Guevara

Fiz o seguinte, gerei um JAR do projeto e importei pro classpath do ireport, deu certo em parte, pq a tela de erro agora é referente ao plugin do Bronx:

Agora ferrou. hehehe

bronx

De acordo com o stack que vc mandou aqui, ele não está encontrando a classe.
Coloca o jar do restritor lá tbm!

Guevara

Beleza! Conforme o Bronx sugeriu, foi só colocar o jar do plugin (restrictrex-1.0.2.jar) dele no classpath que conectou.
O que eu fiz foi gerar um jar do projeto web e importar pro classpath do iReport junto com o jar do restrictrex.
Valeu pela ajuda pessoal! \o/
Vou ver aqui se está td funcionando e conforme for eu volto pra postar o [Resolvido];
Abraço!!

Guevara

Resolvido! \o/

Tô usando HQL, infelizmente o query designer do iReport não possui suporte a Criteria e nem HQL, então têm que fazer as querys na unha.
Valeu!!

Guevara

Andei xurrupiando uns códigos aqui do fórum:
http://www.guj.com.br/posts/list/211723.java
http://www.guj.com.br/posts/list/149769.java
http://www.guj.com.br/posts/list/201929.java#1019973

Fiz o Controller de relatórios e o @Component para gerar o relatório:

@Component
public class Relatorio {
	
	public Relatorio() {
	}
	
	public InputStreamDownload relatorioImovelVenda() throws JRException, SQLException, ClassNotFoundException {
        
InputStream file = (InputStream) getClass().getClassLoader().getResourceAsStream("/br/com/imobiliaria/relatorios/imovelVenda.jasper");
        Map<String,Object> parametros = new HashMap<String, Object>(); 
  		parametros.put("titulo", "Relatório de Vendas");
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        JasperRunManager.runReportToPdfStream(file, os, parametros);
        ByteArrayInputStream document = new ByteArrayInputStream(os.toByteArray());
        return new InputStreamDownload(document, "application/pdf", "relatorio-venda.pdf", true, os.toByteArray().length);
    }
}

Não sei se está certo esse Component ai de cima, mas na hora de fazer um Controller como ficaria?

public Download geraRelatorioImovelVenda() {
	     InputStream relatorio = // como pego o relatorioImovelVenda()  do Component?
	     return new InputStreamDownload(relatorio, "application/pdf", "relatorio-venda.pdf");
	}

Desculpem, mas nas pesquisas que eu fiz cada um faz isso de um jeito ai fiquei meio atrapalhado. =)
Abraço!!

Lucas_Cavalcanti

o seu Relatorio.relatorioImovelVenda poderia retornar um InputStream, e o seu controller recebe esse Relatorio no construtor.

dai vc faria:

public Download geraRelatorioImovelVenda() {  
  InputStream relatorioImovelVenda = this.relatorio.relatorioImovelVenda();
  return new InputStreamDownload(relatorioImovelVenda, "application/pdf", "relatorio-venda.pdf");  
}
Guevara

Oi Lucas!
Eu tinha tentado desse jeito ai, mas não aceita, a mensagem é:

cannot convert to InputStreamDownload to Base64.InputStream

E dá duas opções:

change type of "relatorio" to InputStreamDownload
change return type of relatorioImovelVenda() to InputStream

Nenhuma das duas opções ele aceita, pq lá no Componente está como InputStreamDownload e ele não conseque fazer a conversão.
O meu Componente está certo?

Lucas_Cavalcanti

é pra retornar um InputStream mesmo, não um InputStreamDownload:

@Component
public class Relatorio {
	
	public Relatorio() {
	}
	// import java.io.InputStream
	public InputStream relatorioImovelVenda() throws JRException, SQLException, ClassNotFoundException {
        
InputStream file = (InputStream) getClass().getClassLoader().getResourceAsStream("/br/com/imobiliaria/relatorios/imovelVenda.jasper");
        Map<String,Object> parametros = new HashMap<String, Object>(); 
  		parametros.put("titulo", "Relatório de Vendas");
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        JasperRunManager.runReportToPdfStream(file, os, parametros);
        ByteArrayInputStream document = new ByteArrayInputStream(os.toByteArray());
        return document; // o InputStream!
    }
}
Guevara

Beleza Lucas, fiz as alterações, o import do InputStream estava errado aqui, agora está dando este erro:

root cause

java.lang.ClassNotFoundException: com.lowagie.text.DocumentException
	org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516)
	org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361)
	net.sf.jasperreports.engine.JasperExportManager.exportReportToPdfStream(JasperExportManager.java:158)
	net.sf.jasperreports.engine.JasperRunManager.runReportToPdfStream(JasperRunManager.java:188)
	br.com.imobiliaria.component.Relatorio.relatorioImovelVenda(Relatorio.java:29)
	br.com.imobiliaria.controller.RelatoriosController.geraRelatorioImovelVenda(RelatoriosController.java:23)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:86)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.imobiliaria.interceptor.NoCacheInterceptor.intercept(NoCacheInterceptor.java:41)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:48)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

Removi e coloquei o jar do iText e continua dando esse erro. O jar do JasperReport está na /lib, sabe o que pode ser?

Guevara

Fonte: http://java.itags.org/java-newer/20623/
Têm alguma coisa a ver?
O meu iText é iText-5.0.3 e o do JasperReport é iText-2.1.7.

Lucas_Cavalcanti

os jars do iText e o JasperReport estão na pasta WEB-INF/lib?

Guevara

Estão sim, jasperreports-3.7.3.jar e iText-5.0.3.jar.

Lucas_Cavalcanti

a exception que dá é só essa? tem mais alguma coisa abaixo na stacktrace?
tenta ver se as versões do jasper e do iText são compatíveis…

Guevara

Justamente Lucas, imaginava que fosse isso, baixei o iText-2.1.7.jar daqui e fez o download:
http://www.jarvana.com/jarvana/archive-details/com/lowagie/itext/2.1.7/itext-2.1.7.jar

Mas o PDF veio todo em branco. hehehe
Alguma coisa lá no código tá errada…

Lucas_Cavalcanti

pois eh… não sei se consigo te ajudar com isso, não manjo mto de itext ou ireports… mas vc pode tentar substituir o seu relatório por algum Hello World da vida, e vê se tá funcionando, só pra ver se o problema tá no seu relatório mesmo

Guevara

Beleza, mas ao compilar o relatorio la pelo iReport e gerar um jasper, já tá pronto pra uso e basta fazer o download que ele pega os dados ou preciso no método lá do componente chamar o metodo de listagem da DAO pra inserir no jasper?

InputStream file = (InputStream) getClass().getClassLoader().getResourceAsStream("/br/com/imobiliaria/relatorios/imovelVenda.jasper");

  // Preciso chamar algum método de listagem por aqui e inserir no código ou o jasper consegue achar os dados?
        Map<String,Object> parametros = new HashMap<String, Object>(); 
  		parametros.put("titulo", "Relatorio de Vendas");
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        JasperRunManager.runReportToPdfStream(file, os, parametros);
        ByteArrayInputStream document = new ByteArrayInputStream(os.toByteArray());
        return document;
Lucas_Cavalcanti

isso eu não sei te responder, sorry…não manjo qse nada sobre o jasper…
abre outro tópico perguntando isso…

G

Não esquece de fazer um file.close(). O GC agradece.

Guevara

Tá ótimo Lucas, já me ajudou muito. =)
Vou continuar pesquisando aqui.
Abração! o/

Guevara

Fala Garcia!! :smiley:
file.close() no Componente? Não reparei isso…em que parte do código vc está falando?

G

Você abre um stream aqui:

Então você precisa fecha-lo.

Guevara

Saquei, fechei antes de mandar o document:

file.close();
        return document;

Mas o pdf ainda está vindo em branco, preciso colocar os dados lá pelo visto:

InputStream file = (InputStream) getClass().getClassLoader().getResourceAsStream("/br/com/imobiliaria/relatorios/imovelVenda.jasper");
        Map<String,Object> parametros = new HashMap<String, Object>(); 
        List<Imovel> imoveisVenda = imovelDao.listaVenda();
        for (Imovel imovel : imoveisVenda)
  		parametros.put("titulo", imovel.getTitulo());  	
       parametros.put("bairro", imovel.getBairro());  	
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        JasperRunManager.runReportToPdfStream(file, os, parametros);         
        ByteArrayInputStream document = new ByteArrayInputStream(os.toByteArray());   
        file.close(); // fechei antes de mandar o document ou seria apos o parametros.put?
        return document;
}

Seria algo assim?

G

Mas esse seu método não funciona não. Na linha 4 vocẽ faz um loop, na 5 você fica sobrescrevendo o título a cada iteração, e na linha 6 você chama imovel.getBairro, porém a variável imovel nem está mais disponível.

Guevara

Pois é Garcia, tô varrendo a net em busca de alguma documentação disso para web, mas só têm código velho e a maior parte para desktop e servlets usando classes mais “primitivas”.
Vc têm alguma documentação que possa ser usada com VRaptor?
Abraço!

Guevara

AFF!
import net.sf.jasperreports.engine.JasperManager; <----- Depretated
O framework sofre alterações e não têm um filho de quenga pra atualizar a documentação no site. ¬¬
Como vou adivinhar as classes que posso usar com VRaptor?

G

Não conheço ireport, por isso não posso te ajudar muito. E lembre-se que ireport é independente de Vraptor, ou seja, o mesmo código do ireport que você faz para desktop ou até um aplicação com outro framework funciona no vraptor. Aliás tua dúvida é sobre ireport, não é sobre Vraptor.

Meu alerta foi bem de Java básico.

Creio que no site do fabricante deve haver uma boa documentação.

Lucas_Cavalcanti

http://www.guj.com.br/posts/list/201107.java

da uma olhada nesse post, guevara

Guevara

É lá que eu tô, o código lá é para servlets e usando conexão jdbc, não serve pra usar com VRaptor, onde têm as injeções de métodos e no meu caso, usando Hibernate.
Infelizmente a “documentação” do site esta ultrapassada e é insuficiente:
http://jasperforge.org//website/ireportwebsite/IR%20Website/ir_deploying_reports.html?header=project&target=ireport
Minha dúvida nem é com iReport, pois o relatório já está na pasta e compilado, só falta a parte do método pra pegar o jasper e criar o PDF, pq até o download está funcionando.
Mas tá beleza, uma hora eu acho a resposta. =)
Abraço!!

Lucas_Cavalcanti

vc viu o post http://www.guj.com.br/posts/list/201107.java ?

Guevara

Opa, valeu Lucas, eu tinha visto o JasperMaker do Lavieri e pelo visto vai ter que ser ele mesmo. Vou tentar aqui e já conto o resultado.

Guevara

Em “suaColecaoComOsBeansParaDataSource” qual é a sintaxe para pegar os beans?

Lucas_Cavalcanti

acho que vc pode colocar qqer List, e vc pode pegar ela do banco de dados, por exemplo…

Guevara

Não entendi Lucas, olhei o doc do codigo e esta assim:

Collection<?> dataSource

O Controller não deixa injetar nada e nem importar classe alguma lá, como vou pegar o bean Imovel por exemplo?

Lucas_Cavalcanti
List<Imovel> imoveisVenda = imovelDao.listaVenda();

usa isso como collection (List extends Collection)

Guevara

Então, foi isso que eu fiz, mas o Controller ficou travado, não importa a classe Imovel e nem ImovelDAO.

Lucas_Cavalcanti

como assim travado?

Guevara

Tive que digitar o import:

import br.com.imobiliaria.dao.ImovelDAO;
import br.com.imobiliaria.bean.Imovel;

Sendo que o Imovel ainda esta em vermelho e o List tb a mesma coisa, vou ter que digitar lá o import, o Eclipse não acha nenhum import.
Olha o print:

Lucas_Cavalcanti

Importa a List primeiro…

e vc não pode fazer: “List imoveisVenda = imovelDao.listaVenda();” como parametro de um método…

ou faça isso antes, ou coloque só imovelDao.listaVenda();

Guevara

Agora ta dizendo que não têm bean anotado:

root cause

org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [br.com.imobiliaria.bean.Imovel] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
	org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:896)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:765)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:680)
	org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:771)
	org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:691)
	org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:192)
public Download geraRelatorioImovelVenda() {
	      //aqui vc monta a coleção para ser usada como DataSource no jasper
	      //e coloca seus parametros (se quiser) em um mapa de parametros...
		
		List<Imovel> imoveis = imovelDao.listaVenda();

	      return jasperMaker.makePdf(
	      "imovelVenda.jasper",
	      imoveis, 
	      "relatorio-venda.pdf", 
	      true
	      /*opicionalmenteObjetosParametrosPodemSerEnviadosOuNao*/);
	     }

É isso ai?

Guevara

Esse erro já resolvi, só falta acertar o caminho pro jasper la no web.xml e acho que finalizo. =)

Guevara

Consegui Lucas!! \o/
Valeuu!!! :smiley:
O relatório apareceu certinho em PDF aqui e corretamente preenchido. Tô vendo aqui como concatenar vários beans ali, se é que isso é possível.

Criado 6 de agosto de 2010
Ultima resposta 8 de ago. de 2010
Respostas 48
Participantes 4