簡體   English   中英

注入EntityManager始終為null

[英]Injecting EntityManager always null

我正在嘗試使用CDI將EntityManager注入到我的應用程序中,但是當嘗試使用EntityManager時它為null。

這是我的代碼,我遵循了一些有關如何注入EntityManager的教程,並且使用與那些教程中相同的代碼。

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

}


@Singleton
public class JPAResourceProducer {

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

persistence.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因為注入的EntityManager為null。

我的制作人中有什么我想念的嗎?

@PersistenceContext不能在像tomcat這樣的servlet容器中開箱即用。 它在Java EE容器中工作。

因此,您的EntityManager字段保持為null,因為@PersistencContext在Tomcat中不起作用,即使使用Weld-servlet也是如此。

您可以添加一個ServletListener來引導JPA實現,在這種情況下probalby處於休眠狀態。 然后,您可以通過@Inject獲得EntityManager實例。

請注意,您還應該提供JPA實現(例如休眠),就像對Weld一樣。

您可以嘗試執行以下操作: 在Tomcat中使用生產者注入EntityManager

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM