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), чтобы увидеть, не возникли ли ошибки при развертывании. Также попробуйте использовать отладчик, чтобы увидеть, что является нулем.

Другие вопросы по тегам