NullPointerException с JPA, Eclipselink и Guice
У меня есть класс JpaController, как это:
public class JpaController
{
@Inject private EntityManager em;
@Transactional
public void create(Message msg)
{
em.persist(msg);
}
}
и я устанавливаю com.google.inject.persist.PersistFilter
(хотя и не фильтрует его, потому что на данный момент я не в HTTP-запросе, это фоновый поток).
Я также устанавливаю new JpaPersistModule(PU)
Я думаю, что EntityManager успешно заполнен (хотя я не был бы уверен в этом, потому что код не достигает этой строки).
Исключение, которое выдается, от перехватчика для @Transactional
java.lang.NullPointerException
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.getActivePersistenceContext(EntityManagerImpl.java:1712)
at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.begin(EntityTransactionImpl.java:49)
at com.google.inject.persist.jpa.JpaLocalTxnInterceptor.invoke(JpaLocalTxnInterceptor.java:62)
at my code - the line that called controller.create(msg);
Используемые библиотеки: EclipseLink 2.4.1, guice 3.0, guice-persist 3.0, guice-jndi 3.0, guice-servlet 3.0, MySQL 5.1.25, javax.persistence 2.0.4, Джексон, activemq, lombok, joda-time, javax.mail, javax.inject, asm, jersey, log4j, jettison, jsr311.
2 ответа
Существуют проблемы с непосредственным внедрением EntityManager, который может быть закрыт без подключений...
Вместо внедрения EntityManager, попробуйте реализовать это через провайдера хитрости:
public class JpaController
{
@Inject private Provider<EntityManager> _entityManagerProvider;
@Transactional
public void create(Message msg)
{
_entityManagerProvider.get().persist(msg);
}
}
Теоретически emProvider.get() всегда будет возвращать действительный экземпляр EntityManager через JpaPersistModule
Я предполагаю, что ваш блок персистентности не запустился / не инициализировался или настроен неправильно.
Включите лучший вход (в вашем файле persistence.xml), чтобы увидеть, не возникли ли ошибки при развертывании. Также попробуйте использовать отладчик, чтобы увидеть, что является нулем.