Relatórios com JPA JSF

Boa noite amigos !
Estou com um probleminha chato de resolver, não trabalhei com relatórios ainda e logo de cara estou tentando fazer um em JPA, implementei algumas coisa, porém ainda não funcionaram.
Seguinte toda vez que mando gerar um relatório pela aplicação, o mesmo retorna um mensagem que o relatório não tem nenhuma página. Testei no ireport e funciona, somente na aplicação web que não estou conseguindo. (Acho que estou comendo bronha, porém sou novo nisto). Detalhe: o relatório recebe dois parametros dataInicial dataFinal.
Segue abaixo os códigos caso alguém consiga me ajudar.

Abraços

Everson

package br.com.agenda.bean;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.servlet.ServletContext;

import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.query.JRJpaQueryExecuterFactory;
import net.sf.jasperreports.view.JasperViewer;
import br.com.agenda.infra.JPAUtil;

@ManagedBean
@ViewScoped
public class RelatorioMB {
	// private Date dataInicial;
	// private Date dataFinal;
	private FacesContext context;
	private String caminhoRelatorio;
	private Date dataInicial;
	private Date dataFinal;

	public void geraRelatorio() {
		try {
			context = FacesContext.getCurrentInstance();
			ServletContext sc = (ServletContext) context.getExternalContext()
					.getContext();
			caminhoRelatorio = sc.getRealPath("/relatorios/contatos.jasper");
			Map hints = new HashMap();
			hints.put("dataInicial", dataInicial);
			hints.put("dataFinal", dataFinal);
			Map parameters = new HashMap();
			EntityManager em = new JPAUtil().getEntityManager();
			parameters.put(
					JRJpaQueryExecuterFactory.PARAMETER_JPA_ENTITY_MANAGER, em);
			parameters.put(
					JRJpaQueryExecuterFactory.PARAMETER_JPA_QUERY_HINTS_MAP,
					hints);

			JasperRunManager.runReportToPdfFile(caminhoRelatorio, parameters);
			System.out.println("Gerando relatório");
			JasperPrint jasperPrint = JasperFillManager.fillReport(
					caminhoRelatorio, parameters);
			JasperViewer.viewReport(jasperPrint);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public FacesContext getContext() {
		return context;
	}

	public void setContext(FacesContext context) {
		this.context = context;
	}

	public String getCaminhoRelatorio() {
		return caminhoRelatorio;
	}

	public void setCaminhoRelatorio(String caminhoRelatorio) {
		this.caminhoRelatorio = caminhoRelatorio;
	}

	public Date getDataInicial() {
		return dataInicial;
	}

	public void setDataInicial(Date dataInicial) {
		this.dataInicial = dataInicial;
	}

	public Date getDataFinal() {
		return dataFinal;
	}

	public void setDataFinal(Date dataFinal) {
		this.dataFinal = dataFinal;
	}

}
		<h:body>
			<h:form id="font_um">

				<h:panelGrid id="display" columns="4" cellpadding="4"
					style="margin:0;">
					<f:facet name="header">
						<h:outputText value="Informações" />
					</f:facet>

					<h:outputText value="Data Inicial" />
					<p:calendar value="#{relatorioMB.dataInicial}" label="inicio">
						<f:convertDateTime pattern="dd/MM/yyyy" />
					</p:calendar>

					<h:outputText value="Data Inicial" />
					<p:calendar value="#{relatorioMB.dataFinal}" label="fim">
						<f:convertDateTime pattern="dd/MM/yyyy" />
					</p:calendar>

					<p:commandButton value="Relatório"
						action="#{relatorioMB.geraRelatorio}" image="ui-icon-document"
						immediate="false" ajax="false" />
				</h:panelGrid>
			</h:form>
		</h:body>

cara,

como vc ta utilizando JPA, entao faz o seguinte, faça a sua query no java e peguei seu arraylist e passe para o ireport, segue um metodo que eu fiz para fazer o relatorio como download

public static void imprimir(JRBeanCollectionDataSource ds, String reportUrl, Map<String, Object> parametros){
		FacesContext facesContext = FacesContext.getCurrentInstance();
		
		HttpServletRequest request = (HttpServletRequest) facesContext.getExternalContext().getRequest();
		HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
		OutputStream os = null;
		
		try {
			String reportUrlReal = request.getSession().getServletContext().getRealPath("relatorio" + File.separator + reportUrl);
			
			JasperPrint jasperPrint = JasperFillManager.fillReport(reportUrlReal, parametros, ds);
			byte[] pdf = JasperExportManager.exportReportToPdf(jasperPrint);
			
			os = response.getOutputStream();
			response.setContentType("application/pdf");
			response.setContentLength(pdf.length);
			response.setHeader("Content-disposition","attachment; filename=\""+ reportUrl.substring(0, reportUrl.length() - 7)+ ".pdf\"");
			os.write(pdf);
			os.flush();
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			try {
				if(os != null){
					os.close();
				}
				facesContext.responseComplete();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

chamada

JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(lista);
		
Relatorio.imprimir(ds, "relatorio.jasper", new HashMap<String, Object>());

t+

Não entendi muito bem a implementação, consegue dar uma luz ?

Abraços

cara,

por exemplo, vc vai fazer um consulta hql com JPA e essa consulta vai te retornar um List, com isso vc vai criar um Objeto JRBeanCollectionDataSource e passar essa lista, o outro parametro é o nome do arquivo .jasper (o arquivo deve estar nesse caso na pasta abaixo do WebContent, chamada relatorio) e ultimo parametro é o hashmap com parametros que possa passar ao ireport.

esse metodo vai disponibilizar para download o arquivo pdf gerado.

t+

eveban,

Antes de fazer o que o Alisson sugeriu,vá na opção Propriedades do Relatório e sete a Opção “When no Data” para o valor “All Sections,no Detail”

Retornou um NULL Pointer agora (que merda)

java.lang.NullPointerException
	at net.sf.jasperreports.engine.fill.JRFillImage.evaluateImage(JRFillImage.java:1034)
	at net.sf.jasperreports.engine.fill.JRFillImage.evaluate(JRFillImage.java:1004)
	at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:258)
	at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:499)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillBandNoOverflow(JRVerticalFiller.java:439)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillPageHeader(JRVerticalFiller.java:403)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:166)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:946)
	at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:118)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:435)
	at net.sf.jasperreports.engine.JasperRunManager.runReportToPdfFile(JasperRunManager.java:98)
	at br.com.agenda.bean.RelatorioMB.geraRelatorio(RelatorioMB.java:47)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:98)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:304)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

cara,

vc ta utilizando o metodo que eu te passei?
seu relatorio ta compilando corretamente no ireport?

t+

Ainda não, tentei fazer outro teste primeiro, vou testar o seu agora.
Daqui a pouco dou um retorno.
Abraços

Fiz deste jeito, não consegui muito bem a implementação do seu.

	public void geraRelatorio() {
		try {
			HttpServletResponse response = null;
			EntityManager em = new JPAUtil().getEntityManager();
			em.getTransaction().begin();
			Map hints = new HashMap();
			Date inicio = new Date("1979/10/01");
			hints.put("dataInicial", inicio);
			Date fim = new Date("2011/11/07");
			hints.put("dataFinal", fim);

			Map parameters = new HashMap();
			parameters.put(
					JRJpaQueryExecuterFactory.PARAMETER_JPA_ENTITY_MANAGER, em);
			parameters.put(
					JRJpaQueryExecuterFactory.PARAMETER_JPA_QUERY_HINTS_MAP,
					hints);

			JasperReport pathjrxml = JasperCompileManager
					.compileReport("C:/workspace_Indigo/relatorios/contatos.jrxml");
			JasperPrint printReport = JasperFillManager.fillReport(
					pathjrxml, parameters);
			JasperExportManager.exportReportToPdfFile(printReport,
					"C:/contatos.pdf");

			System.out.println("Gerando relatório");

			byte[] dados = JasperExportManager.exportReportToPdf(printReport);
			em.close();

			response.setContentType("application/pdf");
			ServletOutputStream saida = response.getOutputStream();
			saida.write(dados);
			saida.flush();
			saida.close();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

Parece estar funcionando, porém esta dando o seguinte erro agora:

log4j:WARN No appenders could be found for logger (org.hibernate.type.BasicTypeRegistry).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file:
1. Cannot cast from Date to String
                value = (java.lang.String)(new java.util.Date()); //$JR_EXPR_ID=11$
                        <-------------------------------------->
2. Cannot cast from Integer to String
                value = (java.lang.String)(((java.lang.Integer)variable_PAGE_NUMBER.getValue())); //$JR_EXPR_ID=12$
                        <---------------------------------------------------------------------->
3. Cannot cast from Integer to String
                value = (java.lang.String)(((java.lang.Integer)field_contato_id.getValue())); //$JR_EXPR_ID=14$
                        <------------------------------------------------------------------>
4. Cannot cast from Timestamp to String
                value = (java.lang.String)(((java.sql.Timestamp)field_contato_nascimento.getValue())); //$JR_EXPR_ID=19$
                        <--------------------------------------------------------------------------->
5. Cannot cast from Date to String
                value = (java.lang.String)(new java.util.Date()); //$JR_EXPR_ID=11$
                        <-------------------------------------->
6. Cannot cast from Integer to String
                value = (java.lang.String)(((java.lang.Integer)variable_PAGE_NUMBER.getOldValue())); //$JR_EXPR_ID=12$
                        <------------------------------------------------------------------------->
7. Cannot cast from Integer to String
                value = (java.lang.String)(((java.lang.Integer)field_contato_id.getOldValue())); //$JR_EXPR_ID=14$
                        <--------------------------------------------------------------------->
8. Cannot cast from Timestamp to String
                value = (java.lang.String)(((java.sql.Timestamp)field_contato_nascimento.getOldValue())); //$JR_EXPR_ID=19$
                        <------------------------------------------------------------------------------>
9. Cannot cast from Date to String
                value = (java.lang.String)(new java.util.Date()); //$JR_EXPR_ID=11$
                        <-------------------------------------->
10. Cannot cast from Integer to String
                value = (java.lang.String)(((java.lang.Integer)variable_PAGE_NUMBER.getEstimatedValue())); //$JR_EXPR_ID=12$
                        <------------------------------------------------------------------------------->
11. Cannot cast from Integer to String
                value = (java.lang.String)(((java.lang.Integer)field_contato_id.getValue())); //$JR_EXPR_ID=14$
                        <------------------------------------------------------------------>
12. Cannot cast from Timestamp to String
                value = (java.lang.String)(((java.sql.Timestamp)field_contato_nascimento.getValue())); //$JR_EXPR_ID=19$
                        <--------------------------------------------------------------------------->
12 errors

	at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:191)
	at net.sf.jasperreports.engine.JasperCompileManager.compileReport(JasperCompileManager.java:215)
	at net.sf.jasperreports.engine.JasperCompileManager.compileReport(JasperCompileManager.java:148)
	at br.com.agenda.bean.RelatorioMB.geraRelatorio(RelatorioMB.java:48)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:98)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:304)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

cara,

o problema ta no seu relatorio, vc tem varios erros la.

t+

Relatório no iReport ou BIRT é como receita de bolo. Tem que seguir…
Você fez ou não fez FJ-11 e FJ-21 ?
Tá parecendo que não. Tem vários erros de cast.

O objetivo do grupo é compartilhar informação, prefiro desconsiderar alguns comentários infelizes.
Obrigado Alisson, conforme voce comentou o erro estava [size=18]realmente no Relatório do Ireport[/size]