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:
- JPA: ПРИСОЕДИНЯЙТЕСЬ в JPQL
- Как использовать @Id со строковым типом в JPA / Hibernate?
- JPA - Возврат автоматически сгенерированного идентификатора после сохранения ()
- Разница между FetchType LAZY и EAGER в Java Persistence API?
- JPA с использованием нескольких схем баз данных
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 с тем же результатом.
- Может javax.persistence.Query.getResultList () вернуть null?
- Родные запросы JPA / Hibernate не распознают параметры
- Борьба за понимание правильного использования EntityManager
- Когда должен быть создан / открыт экземпляр EntityManagerFactory?
- Уровни DAO и Service (JPA / Hibernate + Spring)
- Spring-Data FETCH JOIN with Paging не работает
- В двунаправленной ассоциации JPA OneToMany / ManyToOne, что означает «обратная сторона ассоциации»?
- Как определить однонаправленные отношения OneToMany в JPA
Менеджер объектов может быть введен только в 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 и обрабатывает жизненный цикл.
Вероятно, это проблема.