Injeção PersistenceContext EntityManager NullPointerException

Eu tenho uma guerra contendo o seguinte:

META-INF/MANIFEST.MF WEB-INF/classs/META-INF/persistence.xml WEB-INF/classs/com/test/service/TestServlet.class WEB-INF/classs/com/test/service/TestEntity.class WEB-INF/classs/jndi.properties WEB-INF/classs/postgresql-ds.xml WEB-INF/jboss-web.xml WEB-INF/web.xml index.jsp 

persistence.xml:

    org.hibernate.ejb.HibernatePersistence java:/TestDS        

web.xml:

   Test Web Application  resteasy.scan true   org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap   Resteasy org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher   Resteasy /service/*   TestDS javax.sql.DataSource Container Shareable   

Minha class TestServlet é a seguinte:

 package com.test.service; import java.util.*; import javax.persistence.*; import javax.ws.rs.*; @Path("/service") public class TestService { @PersistenceContext(unitName = "test") private EntityManager em; @GET @Path("/get") @Produces("application/json") public List get() { return em.createQuery("from TestEntity").getResultList(); } } 

Quando o método get () é chamado, recebo um NullPointerException; o EntityManager não foi injetado. Alguma sugestão sobre o que eu poderia estar perdendo ou como posso diagnosticá-lo? Há muito pouco no log do servidor.

Eu tenho certeza que eu tinha esse trabalho sem o jboss-web.xml ou a input da fonte de dados no web.xml. Eu implantei o ds.xml para o diretório deploy separadamente também e isso definitivamente pegou – eu posso vê-lo no console JMX.

Tentei usar o JBoss 4.2.3 e um build 6.0 com o mesmo resultado.

    Um gerenciador de entidades só pode ser injetado em classs em execução dentro de uma transação. Em outras palavras, só pode ser injetado em um EJB. A outra class deve usar um EntityManagerFactory para criar e destruir um EntityManager.

    Como o seu TestService não é um EJB, a anotação @PersistenceContext é simplesmente ignorada. Não só isso, no JavaEE 5, não é possível injetar um EntityManager nem um EntityManagerFactory em um Serviço JAX-RS. Você tem que ir com um servidor JavaEE 6 (JBoss 6, Glassfish 3, etc).

    Aqui está um exemplo de injeção de EntityManagerFactory:

     package com.test.service; import java.util.*; import javax.persistence.*; import javax.ws.rs.*; @Path("/service") public class TestService { @PersistenceUnit(unitName = "test") private EntityManagerFactory entityManagerFactory; @GET @Path("/get") @Produces("application/json") public List get() { EntityManager entityManager = entityManagerFactory.createEntityManager(); try { return entityManager.createQuery("from TestEntity").getResultList(); } finally { entityManager.close(); } } } 

    A maneira mais fácil de ir aqui é declarar seu serviço como um EJB 3.1, supondo que você esteja usando um servidor JavaEE 6.

    Pergunta relacionada: Injetar um EJB no JAX-RS (serviço RESTful)

    Se o componente é um EJB, então, não deve haver um problema ao injetar um EM.

    Mas … No JBoss 5, a integração JAX-RS não é ótima. Se você tiver um EJB, não poderá usar a verificação e deverá listar manualmente no context-param resteasy.jndi.resource. Se você ainda tiver a varredura ativada, o Resteasy procurará a class de resources e a registrará como um serviço JAX-RS e manipulará o ciclo de vida.

    Este é provavelmente o problema.