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 и обрабатывает жизненный цикл.

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

    Interesting Posts

    Как динамически создавать переменные в Java?

    Есть ли другой вариант для Picasa с аналогичной простотой использования и простотой?

    Изменение JRE в проекте NetBeans

    Как изменить схему определения местоположения по умолчанию в ASP.NET MVC?

    Как я могу легко сделать страницы для печати на любом веб-сайте?

    Не удается получить файл с помощью asmack и xmpp

    Не удалось решить: com.android.support:appcompat-v7:27.+ (ошибка зависимости)

    Как скопировать все программы с одного ПК с Windows на другой?

    Как создавать / читать / записывать файлы JSon в Qt5

    Overflow-x: скрытый не предотвращает переполнение содержимого в мобильных браузерах

    jQuery ИЛИ Селектор?

    Как я могу ввести тильду (~) в терминале Ubuntu с помощью норвежской клавиатуры?

    Создание нового компьютера – без дисплея, без звуковых сигналов

    Требования к вычислительной способности CUDA

    Как заставить «подтвердить выключение» в Windows 7

    Давайте будем гением компьютера.