5
respostas

Erro: Cannot be cast to org.hibernate.Session

Fala galera blz? Alguém pode me ajudar com esse erro, já procurei alguma coisa sobre, porém não encontrei nada que pudesse me ajudar.

Erro: https://github.com/CarlosEReis/Pedido-Venda/blob/master/ErroAoGerarRelatorio.txt

Classe:

package com.carloser7.pedidovenda.controller;

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

import javax.enterprise.context.RequestScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotNull;

import org.hibernate.Session;

import com.carloser7.pedidovenda.util.jsf.FacesUtil;
import com.carloser7.pedidovenda.util.report.ExecutorRelatorio;

@Named
@RequestScoped
public class RelatorioPedidosEmitidosBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private Date dataInicio;
    private Date dataFim;

    @Inject
    private FacesContext facesContext;

    @Inject
    private HttpServletResponse response;

    @Inject
    private EntityManager manager;

    public void emitir() {
        Map<String, Object> parametros = new HashMap<>();
        parametros.put("data_inicio", this.dataInicio);
        parametros.put("data_fim", this.dataFim);

        ExecutorRelatorio executor = new ExecutorRelatorio("/relatorios/relatorio_pedidos_emitidos.jasper",
                this.response, parametros, "Pedidos emitidos.pdf");

        Session session = (Session) manager.getDelegate();
        session.doWork(executor);

        if (executor.isRelatorioGerado()) {
            facesContext.responseComplete();
        } else {
            FacesUtil.addErrorMessage("A execução do relatório não retornou dados.");
        }
    }

    @NotNull
    public Date getDataInicio() {
        return dataInicio;
    }

    public void setDataInicio(Date dataInicio) {
        this.dataInicio = dataInicio;
    }

    @NotNull
    public Date getDataFim() {
        return dataFim;
    }

    public void setDataFim(Date dataFim) {
        this.dataFim = dataFim;
    }

}
5 respostas

Boa tarde Carlos, tenta subistituir a linha:

Session session = (Session) manager.getDelegate();

por:

Session session = manager.unwrap(Session.class);

Boa tarde Guilherme!

Fiz a alteração que você sugeriu porém o erro continuou. Dei uma nova pesquisada e vi que o problema poderia ser no meu produtor de EntityManager, então como sugestão tirei a anotação @RequestScope e coloquei a @Dependent, e realmente funcionou. Porém não entendi o porque dessa troca e oque muda no meu produtor com essa alteração.

Pode me ajudar a entender oque aconteceu?

@ApplicationScoped
public class EntityManagerProducer {

    private EntityManagerFactory factory;

    public EntityManagerProducer() {
        factory = Persistence.createEntityManagerFactory("PedidoPU");
    }

    @Produces @Dependent
    public EntityManager createEntityManager() {
        return factory.createEntityManager();
    }

    public void closeEntityManager(@Disposes EntityManager manager) {
        manager.close();
    }

}

Up...

Boa tarde Carlos, tenta trocar o @injection por @PersistenceContext:

@PersistenceContext
    private EntityManager manager;

Boa tarde Guilherme,

Com @PersistenceContext está dando NullPointer, só funciona mesmo quando eu coloco @Dependent no produtor de EntityManager.

Agora estou tentando saber porque dessa troca e oque isso inclina no meu produtor com essa alteração.