[RESOLVIDO] JSF + Primefaces + hibernate: problemas com relatorios jasper

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

Quando vc debugou algum dos parametros passados estavam nulo?

Cara,

esse js está nulo?

Nessa linha:

Aliás, já se certificou que nenhum desses parametros chege nulo nesse método?

mas o parameters (Hashmap) não está sendo preenchido em nenhum momento, então, provavelmente ele está nulo. Não tenho nenhum parametros para ser enviado, vocês sabem como deve popular o parameters neste caso?

Rapaz,

geralmente não, tenta passar o caminho do jasper:

String pathJasper = sc.getServletContext().getRealPath("WEB-INF/relatorios/producao") + "/";
Map parameters = new HashMap();
parameters.put("PathRelProducao", pathJasper + "relProducao.jasper"); 

Já estou passando o parametro do caminho do jasper no primeiro parametro, entã, fiz o seguinte:

                parameters.put("PathRelProducao", jasper);
                System.out.println("geraRelatorioFiltroPassandoResultSet jasper: " + jasper);
                System.out.println("geraRelatorioFiltroPassandoResultSet js: " + js.toString() + " / " + js.getClass());
                JasperPrint print = JasperFillManager.fillReport(jasper, parameters, js);

mesmo assim, continuo com o null pointer exception ao chamar o JasperFillManager.fillReport.
Existe alguma outra forma de gerar o relatório?

Isso normalmente tem a ver com versão de biblioteca. Checou se todos os jars são os mesmos no projeto e na versão do iReport que está usando?

Pessoal. Valeu pela ajuda.

Era realmente incompatibilidade de verões das bibliotecas jasper que eu importei no projeto com a versão do iReport que o relatório foi construido.
Baixei a biblioteca projeto do jasper, e importei a biblioteca jasper, commons(todas), itext, groovy-all

ai funcionou direitinho.

Valeu pessoal