[英]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.