CDI: Chamar método de session bem em um producer

4 respostas
H

Olá, eu possuo um projeto enterprise que consiste em um projeto web e um ejb.

Em meu cdi bean com escopo de sessão, localizado no projeto web, possuo o seguinte método producer:

@Named
@SessionScoped
public class AlunoController implements Serializable {

    @Inject @DadoAcademico 
    private DadosAcademicos aluno;
    @Inject
    private DadosAcademicosFacade dadosAcademicosFacade;

    @Produces @DadoAcademico
    public DadosAcademicos generateDadoAcademico() {
        return dadosAcademicosFacade.findAluno(new Long(FacesContext.getCurrentInstance().getExternalContext().getRemoteUser()));
    }
}

Como vcs podem ver ele invoca o método findAluno do session bean dadosAcademicosFacade, que está no projeto EJB, porém é nesse ponto que pego uma NullPointerException, pois dadosAcademicosFacade está nulo.

Meu session bean:

@Stateless
public class DadosAcademicosFacade {
    @Inject @Web2Database
    private EntityManager em;

    public DadosAcademicos findAluno(Long numMatricula) {
        return (DadosAcademicos) em.createNamedQuery("DadosAcademicos.findAlunoReduzido").setParameter("numMatricula", numMatricula).getSingleResult();
    }
}

Por acaso não posso acessar session bean dentro de métodos producers?

4 Respostas

R

kra acho que o problema pode estar em como vc esta injetando as coisas.
tenta mudar a injeção do seu ejb para

@EJB  
    private DadosAcademicosFacade dadosAcademicosFacade;
H

rogerioeerr:
kra acho que o problema pode estar em como vc esta injetando as coisas.
tenta mudar a injeção do seu ejb para

@EJB private DadosAcademicosFacade dadosAcademicosFacade;

Então, na verdade o próprio Gavin King recomenda @Inject ao invés de @EJB sempre, com exceção de beans remotos.

Por via das duvidas eu testei a anotação @EJB, porém isso acaba disparando um novo erro, pois o producer do entityManager não pode mais ser injetado (acredito que só funcione com @Inject).

R

testa mudar o EntityManager pra

@PersistenceContext
    private EntityManager em;
H

rogerioeerr:
testa mudar o EntityManager pra

@PersistenceContext private EntityManager em;

Dessa forma funciona, assim como também funcionava deixando só o producer do entityManager, desse modo eu acabo precisando escolher entre utilizar o producer no meu controller ou no meu session bean, não há nenhuma solução que me permita utilizar producer dos 2 lados?

A minha intenção com isso eh tentar utilizar o CDI da melhor forma possível.

Criado 13 de janeiro de 2012
Ultima resposta 13 de jan. de 2012
Respostas 4
Participantes 2