Java @PersistenceContext始终为空
我正在尝试使用Delta-Spike(Java @PersistenceContext始终为空,java,cdi,deltaspike,openwebbeans,Java,Cdi,Deltaspike,Openwebbeans,我正在尝试使用Delta-Spike(@RunWith(CdiTestRunner.class))让CDI(使用开放webbean)在单元测试中工作。依赖项注入工作正常,但我的EntityManagerFactory始终为空: public class EntityManagerProducer { @PersistenceContext(unitName = "sbPersistenceUnit") private EntityManagerFactory emf; //A
@RunWith(CdiTestRunner.class)
)让CDI(使用开放webbean)在单元测试中工作。依赖项注入工作正常,但我的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资源模块+@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();
}
}
}
在测试类路径中
如果你在他们的邮件列表上问这样的问题,你会很快得到答案。谢谢你的建议,但是这个项目没有春天——它是纯CDI,好吧,很抱歉,你尝试过这个吗?谢谢,我想我在绝望中把它改成了@PersistentContext
。这两种方法都会产生一个空会话工厂。谢谢你的回答,我已经按照你的建议走了一条类似的路线,一切都正常。