Bom dia Pessoal.
Estou finalizando um aplicativo em JSF2 + primefaces e preciso gerar uns relatórios. Meu bean para geração dos relatórios foi construido nos moldes de um outro aplicativo que utilizo acesso ao banco por DAO, mas tive que fazer umas adaptações porque estou usando hibernate neste aplicativo. Basicamente, substitui o JResultSetDataSource por JRBeanCollectionDataSource.
O problema, é que no metodo que gera o relatório, está dando null pointer exception quando mando o jasper gerar o relatório
Bean:
@ManagedBean
@RequestScoped
public class RelatoriosBean {
.....
public RelatoriosBean() {
System.out.println("Relatorios Face");
}
//Método que retorna o caminho completo de um arquivo ou pasta da aplicação.
private String getDiretorioReal(String diretorio) {
HttpSession session = (HttpSession)
FacesContext.getCurrentInstance().getExternalContext().getSession(false);
//FacesContext.getCurrentInstance().addMessage(session.getServletContext().getRealPath(diretorio), new FacesMessage(FacesMessage.SEVERITY_INFO, session.getServletContext().getRealPath(diretorio), session.getServletContext().getRealPath(diretorio)));
return session.getServletContext().getRealPath(diretorio);
}
//Método para retornar o nome da aplicação.
private String getContextPath() {
HttpSession session = (HttpSession)
FacesContext.getCurrentInstance().getExternalContext().getSession(false);
System.out.println(session.getServletContext().getContextPath());
return session.getServletContext().getContextPath();
}
//
private void preenchePdf(JasperPrint print) {
System.out.println("preenchePdf print: " + print);
// seto o nome do relatorio gerado para nome do relatorio + id usuario
relatGerado = nomeRelat + usuarioLogado.getIdUsuario();
System.out.println("preenchePdf relatGerado: " + relatGerado);
// Pego o caminho completo do PDF desde a raiz
saida = getDiretorioReal("WEB-INF/pdf/" + relatGerado + ".pdf");
System.out.println("preenchePdf: saida: " + saida);
try {
// Exporto para PDF
JasperExportManager.exportReportToPdfFile(print, saida);
} catch (JRException ex) {
Logger.getLogger(RelatoriosBean.class.getName()).log(Level.SEVERE, null, ex);
//FacesContext.getCurrentInstance().addMessage(ex.getMessage(), new FacesMessage(FacesMessage.SEVERITY_INFO, ex.getMessage(), ex.getMessage()));
}
/*
* 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() + "WEB-INF/pdf/" + nomeRelat + ".pdf";
System.out.println(saida);
}
public String geraRelatorio() {
saida = null;
HashMap parameters = new HashMap();
String jasper = getDiretorioReal("WEB-INF/jasper/" + nomeRelat + ".jasper");
System.out.println("geraRelatorioFiltroPassandoResultSet empresa: " + usuarioLogado.getNomeUsuario());
try {
// Gero o ResultSet que será enviado a partir da conexão aberta
if (nomeRelat.equals("repCobranca")){
JRBeanCollectionDataSource js;
List<DlvPedidos> pedidos;
pedidos = sesHib.createQuery("select p from DlvPedidos p where p.dlvTipoPagamento = 2 and p.dlvClientes.idCliente = :idCliente").setInteger("idCliente", cliente.getIdCliente()).list();
System.out.println("repCobranca tamanho: " + pedidos.size());
js = new JRBeanCollectionDataSource(pedidos);
disableButton = false;
System.out.println("repCobranca msg: " + msg);
if (msg != null) {
disableButton = true;
FacesContext.getCurrentInstance().addMessage(msg, new FacesMessage(FacesMessage.SEVERITY_INFO, msg, msg));
}
// Mando o jasper gerar o relatório
System.out.println("geraRelatorioFiltroPassandoResultSet jasper: " + jasper);
System.out.println("geraRelatorioFiltroPassandoResultSet js: " + js.toString());
JasperPrint print = JasperFillManager.fillReport(jasper, parameters, js);
// Gero o PDF
preenchePdf(print);
System.out.println("repCobranca " + saida);
}
} catch (Exception e) {
Logger.getLogger(RelatoriosBean.class.getName()).log(Level.SEVERE, null, e);
}
return "relatorios.xhtml";
}
}
pilha de erros:
GRAVE: null
java.lang.NullPointerException
at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:89)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:601)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:517)
at br.com.jvmsoftware.delivery.bean.RelatoriosBean.geraRelatorio(RelatoriosBean.java:123)
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.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
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.UIData.broadcast(UIData.java:1093)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
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:409)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
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.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:662)
o problema ocorre exatamente na linha 123, onde o trecho do código é o seguinte:
JasperPrint print = JasperFillManager.fillReport(jasper, parameters, js);
pelos prints do system, as variáveis jasper e js, estão sendo preenchidas, ao menos não parecem estar nulas, vejam:
geraRelatorioFiltroPassandoResultSet jasper: C:\JoseWork\ProjetosNetbeans\gestao\trunk\Delivery\build\web\WEB-INF\jasper\repCobranca.jasper
geraRelatorioFiltroPassandoResultSet js: net.sf.jasperreports.engine.data.JRBeanCollectionDataSource@13e5454
Alguém tem idéia de porque está acusando o null pointer execeptio? pode ser porque estou passando null no parameters, meu HashMap está nulo? se sim, o que passar na variável?
Obrigado