iReport com JSF

Boa tarde pessoal!

Tenho uma aplicação web usando JSF. Criei um relatório no iReport. Mas não estou sabendo como utilizar ele na web. Tenho uma página de consulta. Nessa página existem vários filtros e um botão. Eu queria que quando o botão fosse acionado a query fosse executada e a página com o relatório fosse aberta. Já está funcionado com a query sendo executada. Quando clico no botão a query é executada pelo Hibernate e é me retornada uma lista de Objetos. O problema é que não sei como atribuir esses objetos ao relatório do iReport e nem abrir esse relatório.

Alguém poderia me ajudar!!

Entao amigo, o seu relatório é simplesmente uma lista exibindo o resultado da consulta? Ou Um relatorio com subReport e td mais?

Enfim, você pode passar uma lista para o relatório renderizala ou parametros, ou os 2.

Enfim, supondo q vc fez sua lista e possui uma colecao do objeto Funcionario.

// Lista a ser exportada
Collection lista = new ArrayList().

// Adicionando na lista de Funcionarios
list.add(new Funcionario("NOME1", "25", "RH"));
list.add(new Funcionario("NOME2", "22", "TI"));
list.add(new Funcionario("NOME3", "26", "FN"));

// Parametros do relatorio, no caso sem nenhum parametro
Map parameters = new HashMap();

// Gera o JasperPrint do relatorio
JasperPrint jasperPrint = JasperFillManager.fillReport("c:\\Relatorio.jasper", parameters, new JRBeanCollectionDataSource(lista));

// Criando arquivo PDF
byte bytes[] = JasperExportManager.exportReportToPdf(jasperPrint);
// Adicionando informações para o response p transferencia
response.addHeader("Content-Disposition", "attachment;filename=\"".concat("nomeRelatorio.pdf"));
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
response.getOutputStream().write(bytes);
response.getOutputStream().flush();

Qualquer duvida se puder ajudar, so falar.

Abraço.

Como pego a response dentro da minha classe JAVA? Poque na minha classe FuncionarioBean, por exemplo, eu tenho a lista com os objetos mas não tenho a response.

Mas a propia classe FuncionarioBean vai ser responsavel por efetuar a exportação?

Se sim, tente passar o response para ela como parametro ou instanciar.

O meu código ficou assim:

[code]public void imprimirRelatorio() {
try {
SolicitacaoDAO sDao = (SolicitacaoDAO) this.getDao();
List lista = sDao.geraRelatorio(this.getSolicitacao());

        FacesContext context = FacesContext.getCurrentInstance();
        ServletResponse response = (ServletResponse) context.getExternalContext().getResponse();

        // Parametros do relatorio, no caso sem nenhum parametro
        Map parameters = new HashMap();

        // Gera o JasperPrint do relatorio
        JasperPrint jasperPrint = JasperFillManager.fillReport("c:\\Relatorio.jasper", parameters, new JRBeanCollectionDataSource(lista));

        // Criando arquivo PDF
        byte bytes[] = JasperExportManager.exportReportToPdf(jasperPrint);
        // Adicionando informações para o response p transferencia
        response.addHeader("Content-Disposition", "attachment;filename=\"".concat("nomeRelatorio.pdf"));
        response.setContentType("application/pdf");
        response.setContentLength(bytes.length);
        response.getOutputStream().write(bytes);
        response.getOutputStream().flush();
    } catch (Exception e) {
        e.printStackTrace();
    }
}[/code]

Mas ficou com erro na linha:

response.addHeader("Content-Disposition", "attachment;filename=\"".concat("nomeRelatorio.pdf"));

Esse método não existe. O que eu fiz de errado?

Qual o erro gerado?

Veja se o objeto response não está nulo.

Pelo que percebi, vc esta recuperando o Response:
ServletResponse response = (ServletResponse) context.getExternalContext().getResponse();

Na veradade, acredito que vc tenha que recuperar o HttpServletResponse

Ok. Peguei o HttpServletResponse. O erro parou de acontecer mas o relatório não é exibido.

[code]SolicitacaoDAO sDao = (SolicitacaoDAO) this.getDao();
List lista = sDao.geraRelatorio(this.getSolicitacao());

FacesContext context = FacesContext.getCurrentInstance();

HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();

// Parametros do relatorio, no caso sem nenhum parametro
Map parameters = new HashMap();

// Gera o JasperPrint do relatorio
JasperPrint jasperPrint = JasperFillManager.fillReport(“D:\solicitacao.jasper”, parameters, new JRBeanCollectionDataSource(lista));

// Criando arquivo PDF
JasperExportManager.exportReportToPdfFile(jasperPrint, “D:\solicitacao.pdf”);
byte bytes[] = JasperExportManager.exportReportToPdf(jasperPrint);
// Adicionando informações para o response p transferencia
response.addHeader(“Content-Disposition”, “attachment;filename=”".concat(“solicitacao.pdf”));
response.setContentType(“application/pdf”);
response.setContentLength(bytes.length);
response.getOutputStream().write(bytes);
response.getOutputStream().flush();[/code]

O relatorio pelo menos está aparecendo em d:\solicitacao.pdf ?

Não!

Era pelo menos para estar gravando neste diretório! Veja se o código está passando corretamente por este ponto.

Está gerando o seguinte erro:

java.lang.NullPointerException at net.sf.jasperreports.engine.JRPropertiesMap.readObject(JRPropertiesMap.java:176) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1846) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1945) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1869) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1667) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1323) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1945) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1869) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1945) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1869) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:88) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:515) at br.com.jdsistemas.sri.bean.SolicitacaoBean.imprimirRelatorio(SolicitacaoBean.java:95) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.el.parser.AstValue.invoke(AstValue.java:172) at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276) at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68) at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77) at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91) at javax.faces.component.UICommand.broadcast(UICommand.java:383) at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:321) at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:296) at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:253) at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:466) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97) at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178) at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:390) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:517) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) at java.lang.Thread.run(Thread.java:619)

Esse erro é gerado quando passa pela instrução:

JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(lista);//Aqui passa JasperPrint jasperPrint = JasperFillManager.fillReport("D:/solicitacao.jasper", parameters, beanCollectionDataSource);//Aqui da erro

Alguém teria alguma solução?

Desde já agradeço!!!

Bom naum sei se eh isso mas derrepente,
os campos no seu relatorio estao com os mesmos nomes do atribustos da lista que vc passa para o ireport??
por exemplo se sua lista for de um tipo Pessoa e contiver os atribustos nome e telefone la no seu relatorio vc tera que ter exatamente os values com este nomes.

Tentei fazer do geito que você falou fBarreto. Mas quando vou compilar o relatório, para gerar o arquivo JASPER, é informado que os campos não existem.
Já tentei de um tudo mas não consigo.

Alguém sabe como resolver isso pessoal?

cara se ta dizendo que os campos nao existem ,pode ser pq vc criou os values mas naum alterou os nomes nos TextField.
Verifique se os values e os seus campos texto estao com as referencias corretas:
tipo se vc tem um value com nome Telefone entaum seu campo texto no relatorio que representa este cara tem que ter a seguinte expressao:

$F{Telefone}, se naum me engano isso e sensitive.