PersistenceContext EntityManager инъекции NullPointerException

У меня есть война, содержащая следующее:

META-INF/MANIFEST.MF WEB-INF/classes/META-INF/persistence.xml WEB-INF/classes/com/test/service/TestServlet.class WEB-INF/classes/com/test/service/TestEntity.class WEB-INF/classes/jndi.properties WEB-INF/classes/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   

Мой class TestServlet выглядит следующим образом:

 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(); } } 

Когда метод get () вызывается, я получаю исключение NullPointerException; EntityManager не был введен. Любые предложения о том, что я могу потерять, или как я могу его диагностировать? В журнале сервера очень мало.

Уверен, что я работал без jboss-web.xml или записи источника данных в web.xml. Я также разложил ds.xml в каталог развертывания, и это определенно подобрано – я вижу его в консоли JMX.

Пробовал использовать JBoss 4.2.3 и версию 6.0 с тем же результатом.

Менеджер объектов может быть введен только в classы, запущенные внутри транзакции. Другими словами, его можно вводить только в EJB. Другой class должен использовать EntityManagerFactory для создания и уничтожения EntityManager.

Поскольку ваш TestService не является EJB, аннотация @PersistenceContext просто игнорируется. Кроме того, в JavaEE 5 невозможно внедрить EntityManager или EntityManagerFactory в службу JAX-RS. Вы должны пойти с сервером JavaEE 6 (JBoss 6, Glassfish 3 и т. Д.).

Вот пример ввода 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(); } } } 

Самый простой способ сделать это – объявить свою службу как EJB 3.1, предполагая, что вы используете сервер JavaEE 6.

Связанный вопрос: Внесите EJB в JAX-RS (служба RESTful)

Если компонент является EJB, то не должно быть проблем с инъекцией EM.

Но … В JBoss 5 интеграция JAX-RS невелика. Если у вас есть EJB, вы не можете использовать сканирование, и вы должны вручную перечислить его в контексте-param resteasy.jndi.resource. Если вы все еще сканируете, Resteasy сканирует class ресурсов и регистрирует его как службу ванильного JAX-RS и обрабатывает жизненный цикл.

Вероятно, это проблема.

  • Перечисление карты в JPA с фиксированными значениями?
  • JPA getSingleResult () или null
  • Как вызвать функцию или процедуру Oracle с помощью Hibernate (EntityManager) или JPA 2
  • Как аннотировать поле автоинкремента MYSQL с аннотациями JPA
  • Метод @Transactional, вызванный из другого метода, не получает транзакции
  • При использовании методов getOne и findOne Spring Data JPA
  • Каков правильный путь для ссылки jar-файла в jpa persistence.xml в веб-приложении?
  • Как выбрать страtagsю генерации идентификатора при использовании JPA и Hibernate
  • JPA / JTA / @Transactional Spring аннотация
  • Где ConfigurationGenerateSchemaCreationScript () переместился в Hibernate 5
  • Сделать hibernate игнорировать переменные classа, которые не отображаются
  • Давайте будем гением компьютера.