Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

@PersistenceContext não está injetando dependência em UsuarioDao

Olá a todos da Caelum.

Segui os exercícios normalmente até a parte da alteração da classe UsuarioDAO para usar o banco de dados para autenticar usuário.

Porém ao rodar o projeto recebo este erro na console:

02:55:24,840 ADVERTÊNCIA [javax.enterprise.resource.webcontainer.jsf.lifecycle] (http-localhost-127.0.0.1-8080-1) #{loginBean.efetuaLogin}: java.lang.NullPointerException: javax.faces.FacesException: #{loginBean.efetuaLogin}: java.lang.NullPointerException
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at javax.faces.component.UICommand.broadcast(UICommand.java:315) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
    at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]
    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final]
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:]
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:]
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_71]
Caused by: javax.faces.el.EvaluationException: java.lang.NullPointerException
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) [jsf-impl-2.1.7-jbossorg-2.jar:]
    ... 24 more
Caused by: java.lang.NullPointerException
    at br.com.caelum.livraria.dao.UsuarioDao.buscaPeloLogin(UsuarioDao.java:17) [classes:]
    at br.com.caelum.livraria.login.LoginBean.efetuaLogin(LoginBean.java:30) [classes:]
    at br.com.caelum.livraria.login.LoginBean$Proxy$_$$_WeldClientProxy.efetuaLogin(LoginBean$Proxy$_$$_WeldClientProxy.java) [classes:]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_71]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_71]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_71]
    at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_71]
    at org.apache.el.parser.AstValue.invoke(AstValue.java:262) [jbossweb-7.0.13.Final.jar:]
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) [jbossweb-7.0.13.Final.jar:]
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:39) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
    ... 25 more

Rodando o servidor em modo Debug pelo Eclipse, notei que o atributo entityManager está nulo, como se a injeção via @PersistenceContext não fizesse nenhum efeito. Segue meu código:

package br.com.caelum.livraria.dao;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import br.com.caelum.livraria.modelo.Usuario;

@Stateless
public class UsuarioDao {

    @PersistenceContext
    private EntityManager entityManager;

    public Usuario buscaPeloLogin(String login) {
        Usuario usuario = (Usuario) this.entityManager.createQuery("select u from Usuario u where u.login=:pLogin").setParameter("pLogin", login).getSingleResult();
        return usuario;
    }    
}

O que pode estar acontecendo?

Grata.

7 respostas

Ola Luanda,

Você chegou a realizar o insert na tabela de usuários?

insert into livraria.usuario(login,senha) values('admin','pass')

Abraços

Olá, Thiago!

Fiz o insert sim!

O que ocorre, acredito, é que não se trata da consulta não retornar nada. O código já acusa NullPointerException já ao invocar o método "createQuery" do EntityManager.

Grata.

Luanda,

Tenta utilizar a passagem da classe como parametro ao inves de fazer cast na consulta, assim :

return this.entityManager.createQuery("select aqui",Usuario.class).setParameter("pLogin",login).getSingleResult();
solução!

Oi Luanda

Você poderia postar também o código completo da classe LoginBean? Talvez você tenha utilizado um new UsuarioDao() ao invés de fazer a injeção de dependências com o CDI.

Para que o container EJB do Java EE consiga fazer a injeção do EntityManager com o @PersistenceContext o EJB não pode ser instanciado pelo seu código, ele deve ser criado e injetado pelo próprio container EJB através do CDI:

@Named
@RequestScoped
public class LoginBean {
    @Inject
    private UsuarioDao usuarioDao; 
}

Só complementando o comentário do Victor. Você também poderia injetar o UsuárioDAO usando o próprio EJB:

@Named
@RequestScoped
public class LoginBean {
    @EJB
    private UsuarioDao usuarioDao; 
}

Olá Luanda,

O que Victor colocou é muito importante. Se dermos new em um objeto, seremos nós os responsáveis pelo seu gerenciamento. Agora, quando usamos @inject ou @EJB, estamos invertendo o controle. Quem dá new no objeto é o container (CDI, EJB, etc.). Como é o container que está dando new, ele também pode adicionar serviços para o objeto. Por isso é interessante que o container crie esses objetos para nós, pois ganhamos muita coisa prontinha para usar.

Olá a todos!

A observação do Victor está correta.

Eu realmente esqueci de injetar o UsuarioDAO na classe LoginBean. Agora está tudo funcionando normalmente.

Grande abraço a todos!