[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><propertyname="connection.url">jdbc:postgresql://localhost/imobiliaria</property><propertyname="connection.driver_class">org.postgresql.Driver</property><propertyname="dialect">org.hibernate.dialect.PostgreSQLDialect</property><propertyname="connection.username">user</property><propertyname="connection.password">123456</property><propertyname="connection.pool_size">1</property><propertyname="current_session_context_class">thread</property><propertyname="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property><propertyname="hibernate.show_sql">true</property><propertyname="hibernate.format_sql">true</property><propertyname="hibernate.hbm2ddl.auto">update</property><mappingclass="br.com.imobiliaria.bean.Contato"/><mappingclass="br.com.imobiliaria.bean.Imovel"/><mappingclass="br.com.imobiliaria.bean.Proprietario"/><mappingclass="br.com.imobiliaria.bean.Foto"/><mappingclass="br.com.imobiliaria.bean.Pedido"/><mappingclass="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!!
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!!
Fiz o Controller de relatórios e o @Component para gerar o relatório:
@ComponentpublicclassRelatorio{publicRelatorio(){}publicInputStreamDownloadrelatorioImovelVenda()throwsJRException,SQLException,ClassNotFoundException{InputStreamfile=(InputStream)getClass().getClassLoader().getResourceAsStream("/br/com/imobiliaria/relatorios/imovelVenda.jasper");Map<String,Object>parametros=newHashMap<String,Object>();parametros.put("titulo","Relatório de Vendas");ByteArrayOutputStreamos=newByteArrayOutputStream();JasperRunManager.runReportToPdfStream(file,os,parametros);ByteArrayInputStreamdocument=newByteArrayInputStream(os.toByteArray());returnnewInputStreamDownload(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?
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:
@ComponentpublicclassRelatorio{publicRelatorio(){}// import java.io.InputStreampublicInputStreamrelatorioImovelVenda()throwsJRException,SQLException,ClassNotFoundException{InputStreamfile=(InputStream)getClass().getClassLoader().getResourceAsStream("/br/com/imobiliaria/relatorios/imovelVenda.jasper");Map<String,Object>parametros=newHashMap<String,Object>();parametros.put("titulo","Relatório de Vendas");ByteArrayOutputStreamos=newByteArrayOutputStream();JasperRunManager.runReportToPdfStream(file,os,parametros);ByteArrayInputStreamdocument=newByteArrayInputStream(os.toByteArray());returndocument;// o InputStream!}}
Guevara
Beleza Lucas, fiz as alterações, o import do InputStream estava errado aqui, agora está dando este erro:
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?
InputStreamfile=(InputStream)getClass().getClassLoader().getResourceAsStream("/br/com/imobiliaria/relatorios/imovelVenda.jasper");//Precisochamaralgummétododelistagemporaquieinserirnocódigoouojasperconsegueacharosdados?
Map<String,Object>parametros=newHashMap<String,Object>(); parametros.put("titulo","Relatorio de Vendas");ByteArrayOutputStreamos=newByteArrayOutputStream();JasperRunManager.runReportToPdfStream(file,os,parametros);ByteArrayInputStreamdocument=newByteArrayInputStream(os.toByteArray());returndocument;
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
garcia-jj
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!! file.close() no Componente? Não reparei isso…em que parte do código vc está falando?
G
garcia-jj
Você abre um stream aqui:
Então você precisa fecha-lo.
Guevara
Saquei, fechei antes de mandar o document:
file.close();returndocument;
Mas o pdf ainda está vindo em branco, preciso colocar os dados lá pelo visto:
InputStreamfile=(InputStream)getClass().getClassLoader().getResourceAsStream("/br/com/imobiliaria/relatorios/imovelVenda.jasper");Map<String,Object>parametros=newHashMap<String,Object>(); List<Imovel>imoveisVenda=imovelDao.listaVenda();for(Imovelimovel:imoveisVenda)parametros.put("titulo",imovel.getTitulo()); parametros.put("bairro",imovel.getBairro()); ByteArrayOutputStreamos=newByteArrayOutputStream();JasperRunManager.runReportToPdfStream(file,os,parametros); ByteArrayInputStreamdocument=newByteArrayInputStream(os.toByteArray()); file.close(); // fechei antes de mandar o document ou seria apos o parametros.put?returndocument;
}
Seria algo assim?
G
garcia-jj
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
garcia-jj
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.
É 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!!
Esse erro já resolvi, só falta acertar o caminho pro jasper la no web.xml e acho que finalizo. =)
Guevara
Consegui Lucas!! \o/
Valeuu!!!
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.