@PersistenceContext injetado null pelo GlassFish

4 respostas
C

Pessoal eu estou fazendo uma aplicação EJB 3.0 no NetBeans 6.5 que quando eu chamo o metodo adicionarUsuario do modulo cliente me lanca um erro no qual parece que o entitymanager esta null.

olha o erro que e mostrado quando eu rodo o cliente.
a linha 26 de UsuarioFacade.java é em.persist(usuario)

estou usando NetBeans 6.5, toplink, Servidor GlassFish, JEE 5
alquem sabe porque desse erro??

minha aplicacao client

@EJB
    private static TestarRemote testarBean;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       testarBean = new TestarBean();
       System.out.println(testarBean.status());
       testarBean.adicionarUsuario();

    }

Usuario.java

@Entity
@Table(name = "usuario")
@NamedQueries({@NamedQuery(name = "Usuario.findAll", query = "SELECT u FROM Usuario u"), @NamedQuery(name = "Usuario.findById", query = "SELECT u FROM Usuario u WHERE u.id = :id"), @NamedQuery(name = "Usuario.findByNome", query = "SELECT u FROM Usuario u WHERE u.nome = :nome")})
public class Usuario implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @Column(name = "nome")
    private String nome;

    public Usuario() {
    }

    public Usuario(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Usuario)) {
            return false;
        }
        Usuario other = (Usuario) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.tabelas.Usuario[id=" + id + "]";
    }

UsuarioFacadeLocal.java

@Local
public interface UsuarioFacadeLocal {

    void create(Usuario usuario);

    void edit(Usuario usuario);

    void remove(Usuario usuario);

    Usuario find(Object id);

    List<Usuario> findAll();

}

UsuarioFacade.java

@Stateless
public class UsuarioFacade implements UsuarioFacadeLocal {
    @PersistenceContext
    private EntityManager em;

    public void create(Usuario usuario) {
        if (em == null){
            System.out.println("EntityManager esta null");
        }
        em.persist(usuario);
    }

    public void edit(Usuario usuario) {
        em.merge(usuario);
    }

    public void remove(Usuario usuario) {
        em.remove(em.merge(usuario));
    }

    public Usuario find(Object id) {
        return em.find(Usuario.class, id);
    }

    public List<Usuario> findAll() {
        return em.createQuery("select object(o) from Usuario as o").getResultList();
    }

    

}

TestarRemote.java

@Remote
public interface TestarRemote {

    String status();

    void adicionarUsuario();
    
}

TestarBean.java

@Stateless
public class TestarBean implements TestarRemote {

    public String status() {
        return "Status OK";
    }

    public void adicionarUsuario() {
        Usuario usuario = new Usuario();
        usuario.setNome("Nome do Usuario");
        UsuarioFacade facade = new UsuarioFacade();
        facade.create(usuario);
    }
    
    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method" or "Web Service > Add Operation")
 
}

4 Respostas

Rafael_Carneiro

Como está o nome da sua unidade de persistência?

C

O nome dela é EJBTestePU
um outro detalhe a Tabela no banco esta sendo criado pela persistencia.

A Aplicacao é Desktop

L

O EJB só é injetado quando o objeto cliente é um managed bean do JSF, um outro EJB ou um Servlet. Ou seja, precisa ser um objeto gerenciado por algum container. Fora isso não dá pra usar injeção, tem que buscar o objeto na mão.

Vamos rever a sua aplicação cliente, vou explicar nos comentários:

// por não ser um objeto gerenciado por um container,
// a injeção não vai ocorrer e a referência "testarBean"
// estará null
@EJB  
private static TestarRemote testarBean;  

/** 
 * @param args the command line arguments 
 */  
public static void main(String[] args) {  
   // Veja que você instanciou o objeto, o que é errado,
   // pois o EJB não se instancia, recebe do container.
   // Na realidade, o objeto que deveria ser um bean,
   // acaba sendo um objeto comum e, portanto, este
   // também não terá seus EJB e outros recursos injetados.
   testarBean = new TestarBean();  
   System.out.println(testarBean.status());  
   testarBean.adicionarUsuario();  

}

O que você deve fazer?

Bom, você deverá usar o objeto InitialContext para obter uma referência do EJB. Esse InitialContext recebe configurações que é específico para cada servidor. Se estiver usando o Glassfish, e o servidor fica na mesma máquina que o desktop. Basta colocar o appserv-rt.jar (dentro de lib no Glassfish) no classpath da aplicação cliente. Para outros casos do Glassfish, existe a FAQ. Para outros servidores, existem documentações específicas na internet.

C

Leonardo inclui o jar appserv-rt.jar no classpath e tb procurei um exemplo no site do glassfish
fiz como o exemplo que baixei para utilizar EJB 3.0
agora executo a aplicacao acontece esse outro erro

public class Main {
    @EJB
    private static TestarRemote testarBean;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception {
       InitialContext ic = new InitialContext();
       
       System.out.println(testarBean.status());
       testarBean.adicionarUsuario();
      

    }
}

so esta acontecendo pq eu estou usando JPA, se eu usar Hibernate funciona legal, mas eu queria usar JPA, pra cair fora das sessions do HB

Criado 21 de janeiro de 2009
Ultima resposta 22 de jan. de 2009
Respostas 4
Participantes 3