@PersistenceContext 始终为空
@PersistenceContext is always null
我正在尝试使用 Delta Spike (@RunWith(CdiTestRunner.class)
) 在单元测试中使 CDI(使用 Open Web Beans)工作。依赖注入工作正常,但我的 EntityManagerFactory 始终为空:
public class EntityManagerProducer {
@PersistenceContext(unitName = "sbPersistenceUnit")
private EntityManagerFactory emf; //Always null
@Produces
public EntityManager create() {
return emf.createEntityManager();
}
public void close(@Disposes EntityManager em) {
if (em.isOpen()) {
em.close();
}
}
}
我知道我的 persistence.xml
没问题,因为我可以手动创建会话工厂:
EntityManagerFactory test = Persistence.createEntityManagerFactory("sbPersistenceUnit");
并且所有其他注入都工作正常。有人知道可能缺少什么吗?
您是否将 entitymanagerFactory 定义为 bean?
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
您将需要使用 @PersistenceUnit
来注入 EntityManagerFactory。 @PersistentContext
用于EntityManager注入。
在单元测试中,您不在托管环境中。
OpenWebBeans 将通过 openwebbeans-resource 模块 + @PersistenceUnit 支持它,但这不是可移植的。
所以你需要使用例如:
@Specializes
public class TestEntityManagerProducer extends EntityManagerProducer {
private EntityManagerFactory emf = Persistence.createEntityManagerFactory("...");
@Produces
//...
@Override
protected EntityManager create() {
return emf.createEntityManager();
}
@Override
protected void close(@Disposes EntityManager em) {
if (em.isOpen()) {
em.close();
}
}
}
在测试类路径中
如果你在他们的邮件列表上提出这样的问题,你很快就会得到答案。
我正在尝试使用 Delta Spike (@RunWith(CdiTestRunner.class)
) 在单元测试中使 CDI(使用 Open Web Beans)工作。依赖注入工作正常,但我的 EntityManagerFactory 始终为空:
public class EntityManagerProducer {
@PersistenceContext(unitName = "sbPersistenceUnit")
private EntityManagerFactory emf; //Always null
@Produces
public EntityManager create() {
return emf.createEntityManager();
}
public void close(@Disposes EntityManager em) {
if (em.isOpen()) {
em.close();
}
}
}
我知道我的 persistence.xml
没问题,因为我可以手动创建会话工厂:
EntityManagerFactory test = Persistence.createEntityManagerFactory("sbPersistenceUnit");
并且所有其他注入都工作正常。有人知道可能缺少什么吗?
您是否将 entitymanagerFactory 定义为 bean?
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
您将需要使用 @PersistenceUnit
来注入 EntityManagerFactory。 @PersistentContext
用于EntityManager注入。
在单元测试中,您不在托管环境中。 OpenWebBeans 将通过 openwebbeans-resource 模块 + @PersistenceUnit 支持它,但这不是可移植的。 所以你需要使用例如:
@Specializes
public class TestEntityManagerProducer extends EntityManagerProducer {
private EntityManagerFactory emf = Persistence.createEntityManagerFactory("...");
@Produces
//...
@Override
protected EntityManager create() {
return emf.createEntityManager();
}
@Override
protected void close(@Disposes EntityManager em) {
if (em.isOpen()) {
em.close();
}
}
}
在测试类路径中
如果你在他们的邮件列表上提出这样的问题,你很快就会得到答案。