Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @PersistenceContext始终为空_Java_Cdi_Deltaspike_Openwebbeans - Fatal编程技术网

Java @PersistenceContext始终为空

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

我正在尝试使用Delta-Spike(
@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
。这两种方法都会产生一个空会话工厂。谢谢你的回答,我已经按照你的建议走了一条类似的路线,一切都正常。