Pergunta

Eu sou novo no Java Ee. Tentei fazer alguns primeiros exemplos em execução (JPA). Estou usando o Glassfish V3. O problema é que eu não recebo o servidor de aplicativos injetando o entityManager. Ouvir é um exemplo http://www.adam-bien.com/roller/abien/entry/ejb_3_persistence_jpa_forque eu estendei com um cliente JSP.

Entidade:


package beans;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Book {

    @Id
    @GeneratedValue
    private Long id;
    private String title;
    private String subtitle;

    public Book() {
    }

    public Book(String title) {
        this.title = title;
    }
}

Interface do BookService:


package beans;
import javax.ejb.Local;

@Local
public interface BookService {
    Book createOrUpdate(Book book);
    void remove(Book book);
    Book find(Object id);
}

BookServiceBean:


package beans;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class BookServiceBean implements BookService {

    @PersistenceContext
    private EntityManager em;

    public Book createOrUpdate(Book book) {
        return em.merge(book);
    }
    public void remove(Book book) {
        em.remove(em.merge(book));
    }
    public Book find(Object id) {
        return em.find(Book.class, id);
    }
}

persistence.xml:

<persistence>
    <persistence-unit name="sample" transaction-type="JTA">
    <jta-data-source>jdbc/MarcelsDataSource</jta-data-source>
    <properties>
        <property name="eclipselink.ddl-generation" value="create-tables"/>
    </properties>
</persistence-unit>
</persistence>

index.jsp:

<%@ page import="beans.BookServiceBean" %>
<%@ page import="beans.Book" %>
<html>
<body>
<%
    BookServiceBean bs = new BookServiceBean();
    Book b = new Book("Superman");
    bs.createOrUpdate(b);
%>
</body>
</html>

Se eu executar o exemplo, recebo um java.lang.nullPointerException no método createorupdate () para que o entityManager obviamente não seja injetado corretamente. Tentei encontrar um remédio há dias e alguma ajuda seria muito apreciada.

Obrigado

Marcel

Foi útil?

Solução

Você recebe um NullPointerException Porque você está instanciando o seu BookService com um new() - o que é basicamente errado - e nada é injetado no EJB. O EJB é componente gerenciado pelo contêiner e deve ser obtido por injeção ou com uma pesquisa.

Aqui, enquanto a especificação JSP permite que qualquer código seja executado em um script, chamar um EJB de um JSP não é realmente incentivado e os JSPs não suportam a injeção. Em outras palavras, você terá que usar uma pesquisa:

<%@ page import="beans.BookService" %>
<%@ page import="beans.Book" %>
<html>
<body>
<%
    BookService bs = (BookService) new InitialContext().lookup("java:module/BookServiceBean")
    Book b = new Book("Superman");
    bs.createOrUpdate(b);
%>
</body>
</html>

Mas você deve ligar para o seu EJB de um servlet ou um feijão gerenciado por JSF (e seu EJB pode ser injetado em tais componentes).

Se você precisar de algumas amostras, dê uma olhada no Java EE Código Amostras e Aplicativos.

Atualizar: Ver Como faço para acessar um componente EJB local de um pojo? nas perguntas frequentes do EJB para obter mais detalhes sobre o JNDI (especialmente o novo Nomes JNDI globais portáteis definidos pela especificação EJB 3.1).

Outras dicas

Tentar:

@PersistenceContext(unitName = "sample")
private EntityManager em;

Você está instanciando diretamente o feijão de serviço, quando realmente precisa estar com o contêiner injetando -o (via @EJB). Porém, isso não é suportado em um JSP, então você terá que mudar para um servlet também.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top