gpt4 book ai didi

java - 注入(inject)EntityManager始终为null

转载 作者:行者123 更新时间:2023-12-02 04:40:57 26 4
gpt4 key购买 nike

我正在尝试使用 CDI 将 EntityManager 注入(inject)到我的应用程序中,但在尝试使用它时 EntityManager 为 null。

这是我的代码,我遵循了几个有关如何注入(inject) EntityManager 的教程,并且我使用与这些教程中相同的代码。

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface DevDatabase {

}


@Singleton
public class JPAResourceProducer {

@Produces
@PersistenceContext(unitName = "DevPU")
@DevDatabase
private EntityManager em;
}

持久化.xml

<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="DevPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>entity.MyEntity</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/MyDB"/>
<property name="javax.persistence.jdbc.user" value="appuser"/>
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
<property name="javax.persistence.jdbc.password" value="apppassword"/>
</properties>
</persistence-unit>
</persistence>

这就是我在 DAO 中使用它的方式

public abstract class GenericDAO<T> {

@DevDatabase
@Inject
private EntityManager em;
private final Class<T> entityClass;

public GenericDAO(Class<T> entityClass) {
this.entityClass = entityClass;
}

public void beginTransaction() {
em.getTransaction().begin();
}
}

具体 DAO

public class MyEntityDAO extends GenericDAO<MyEntity> {

public MyEntityDAO() {
super(MyEntity.class);
}
}

在我的代码中的某个地方,当我调用例如 myEntityDao.beginTransaction() 时,我得到一个 NullPointerException ,因为注入(inject)的 EntityManager 为 null。

我的制作人有什么缺失吗?

最佳答案

@PersistenceContext 在像 tomcat 这样的 servlet 容器中不能开箱即用。它在 Java EE 容器中工作。

因此,您的 EntityManager 字段保持为 null,因为 @PersistencContext 在 Tomcat 中没有任何效果,即使使用 Weld-servlet 也是如此。

您可以添加一个 ServletListener 来引导 JPA 实现,在您的情况下可能是 hibernate 。然后就可以通过@Inject获取EntityManager实例。

请注意,您还应该提供 JPA 实现(如 hibernate),就像您为 Weld 所做的那样。

您可以尝试执行以下操作:Injecting EntityManager with a producer in tomcat

关于java - 注入(inject)EntityManager始终为null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30200427/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com