2015-05-12 11 views
0

Я пытаюсь внедрить EntityManager в мое приложение, используя CDI, но EntityManager имеет значение null при попытке его использования.Injecting 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.

Есть ли что-нибудь, что мне не хватает в моем продюсере?

+0

вы используете весной или J2EE? – WeMakeSoftware

+0

Я не использую весну, я использую Tomcat в качестве контейнера, я предоставил сварку-servlet.jar – jerome

+0

опубликовать конфигурацию сварки – WeMakeSoftware

ответ

1

@PersistenceContext не работает из-под коробки в контейнере сервлетов, как tomcat. Он работает в контейнере Java EE.

Так что ваше поле EntityManager остается равным нулю, потому что @PersistencContext не имеет эффекта в Tomcat, даже используя Weld-servlet.

Вы можете добавить ServletListener для загрузки JPA-реализации, в том случае, если вы спящий режим в вашем случае. Затем вы можете получить EntityManager экземпляров через @Inject.

Обратите внимание, что вы также должны предоставить реализацию JPA (например, спящий режим), так же, как и для Weld.

Вы можете попробовать сделать что-то вроде: Injecting EntityManager with a producer in tomcat