繁体   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