1
resposta

[OFF] Porque EJB está nullo ?

Estou fazendo uma requisição para "/contador/{id}" pelo PostMan e quando o código chega em notificaoDAO.contador(id), recebo a mensagem de erro dizendo que notificacaoDAO é null.

PS: Estou usando Wildfly 11 com Eclipse Oxygen

Ele etá iniciando o JDNI, mas não consigo injetar, ele não inicializa o DAO.

10:31:23,633 INFO [org.jboss.as.ejb3.deployment] (MSC service thread 1-5) WFLYEJB0473: JNDI bindings for session bean named 'NotificacaoDAOEJB' in deployment unit 'deployment "SouVizinho.war"' are as follows:

java:global/SouVizinho/NotificacaoDAOEJB!br.com.br.ejb.NotificacaoDAOEJB java:app/SouVizinho/NotificacaoDAOEJB!br.com.br.ejb.NotificacaoDAOEJB java:module/NotificacaoDAOEJB!br.com.br.ejb.NotificacaoDAOEJB java:global/SouVizinho/NotificacaoDAOEJB java:app/SouVizinho/NotificacaoDAOEJB java:module/NotificacaoDAOEJB

10:31:23,634 INFO [org.jboss.as.ejb3.deployment] (MSC service thread 1-5) WFLYEJB0473: JNDI bindings for session bean named 'NotificacaoControladorEJB' in deployment unit 'deployment "SouVizinho.war"' are as follows:

java:global/SouVizinho/NotificacaoControladorEJB!br.com.souvizinho.controlador.NotificacaoControladorEJB java:app/SouVizinho/NotificacaoControladorEJB!br.com.souvizinho.controlador.NotificacaoControladorEJB java:module/NotificacaoControladorEJB!br.com.souvizinho.controlador.NotificacaoControladorEJB java:global/SouVizinho/NotificacaoControladorEJB java:app/SouVizinho/NotificacaoControladorEJB java:module/NotificacaoControladorEJB

Controller



    import javax.ejb.EJB;
    import javax.ejb.LocalBean;
    import javax.enterprise.context.RequestScoped;
    import javax.ws.rs.Consumes;
    import javax.ws.rs.GET;
    import javax.ws.rs.POST;
    import javax.ws.rs.Path;
    import javax.ws.rs.PathParam;
    import javax.ws.rs.Produces;

    @Path("ejb/notificacao")
    @Stateless
    @LocalBean
    public class NotificacaoControladorEJB {


        SmartJava smartjava = new SmartJava();
        @EJB
        NotificacaoDAOEJB notificacaoDAO;


        @GET
        @Produces("application/json; charset=UTF-8")
        @Path("/contador/{id}")
        public Notificacao contadorGet(@PathParam("id") int id) {
            long quantidade;
            try {
                quantidade = notificacaoDAO.contador(id);

                return new Notificacao(quantidade);
            } catch(Exception e) {
                quantidade = 0;
                System.err.println(smartjava.getFullStackTrace(e));

                return new Notificacao(quantidade);
            }
        }

DAO



    import java.util.List;

    import javax.ejb.LocalBean;
    import javax.ejb.Stateless;
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;





    @Stateless
    @LocalBean
    public class NotificacaoDAOEJB {

        //private EntityManagerFactory entityManagerFactory;
        @PersistenceContext
        private EntityManager entityManager;

        SmartJava sj = new SmartJava();



        public Notificacao Salvar(Notificacao notificacao) {

            try {
                this.entityManager.getTransaction().begin();
                this.entityManager.persist(notificacao);
                this.entityManager.getTransaction().commit();
            } catch (Exception e) {
                System.out.println(sj.getFullStackTrace(e));

            } finally {
                //this.entityManager.close();
            }

            return notificacao;
        }

        public void Alterar(Notificacao notificacao){

            this.entityManager.getTransaction().begin();
            this.entityManager.merge(notificacao);
            this.entityManager.getTransaction().commit();
            //this.entityManager.close();

        }

        @SuppressWarnings("unchecked")
        public List<Notificacao> Listar(){
            return this.entityManager.createQuery("SELECT a FROM Notificacao a ORDER BY a.dtcad").getResultList();
        }

        public Notificacao GetNotificacao(int nrseq) {
            return this.entityManager.find(Notificacao.class, nrseq);
        }
        @SuppressWarnings("unchecked")
        public long contador(int nrsequsuario) {
            try {
                return (long) this.entityManager.createQuery("SELECT COUNT(a) FROM Notificacao a "
                        + "WHERE a.visualizado = false AND a.useralvo.nrseq = :usuario ORDER BY a.dtcad")
                        .setParameter("usuario", nrsequsuario).getSingleResult();
            } catch(Exception e) {
                System.err.println(sj.getFullStackTrace(e));
                return 0;
            }
        } 

    }
1 resposta

Oi Felipe,

Não me recordo se é obrigatório, mas tenta utilizar um interface para injetar sua classe Dao. Algo como:

public interface NotificacaoDAO {
    //metodos...
}
public class NotificacaoDAOEJB implements NotificacaoDAO {
    //metodos...
public class NotificacaoControladorEJB {
    //injecao pela interface:
        @EJB
        NotificacaoDAO notificacaoDAO;
}

Veja se resolve.

Bons estudos!