0

我有一个这样的 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、Jackson、activemq、lombok、joda-time、javax。邮件、javax.inject、asm、jersey、log4j、jettison、jsr311。

4

2 回答 2

1

直接注入 EntityManager 有很多问题,可以关闭,没有连接,...

不要注入 EntityManager,而是尝试通过 guice 提供程序来实现它:

public class JpaController
{
  @Inject private Provider<EntityManager> _entityManagerProvider;

  @Transactional
  public void create(Message msg)
  {
    _entityManagerProvider.get().persist(msg);
  }
}

理论上,emProvider.get() 将始终通过 JpaPersistModule 返回一个有效的 EntityManager 实例

于 2014-01-08T09:08:14.040 回答
0

我的猜测是您的持久性单元无法启动/初始化,或者配置不正确。

启用最好的日志记录(在您的 persistence.xml 中)以查看部署时是否发生任何错误。还可以尝试使用调试器来查看什么是空的。

于 2013-09-10T14:54:08.560 回答