簡體   English   中英

CDI不注入entitymanager

[英]cdi does not inject entitymanager

cdi不會注入entitymanager,總是nullpointer。 配置如下:

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
 <persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
    version="1.0">
    <persistence-unit name="tutoroo" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:/tutoroo</jta-data-source>
        <properties>
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="false" />
            <property name="hibernate.hbm2ddl.auto" value="create-drop" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
        </properties>
    </persistence-unit>
 </persistence>

public class ProdutorEntityManager implements Serializable {

    private EntityManagerFactory factory = Persistence.createEntityManagerFactory("tutoroo");
   //private EntityManager entityManager = factory.createEntityManager();

    @Produces
    @PersistenceContext
    @RequestScoped
    public EntityManager criaEntityManager(){
        return factory.createEntityManager();
    }

    public void dispose(@Disposes EntityManager em) {
        em.close();
    }
}

public class UsuarioDaoImp implements UsuarioDao {

    @Inject
    private EntityManager manager; 

    public void salvar(Usuario usuario) {
        manager.persist(usuario);
    }
}

當我調試EntityManager UsuarioDaoImp類時,會發生此異常:com.sun.jdi.InvocationException發生了調用方法。

我不知道我在做什么錯。 有人可以幫忙嗎?

服務器是:jboss-as-7.1.1

首先,不要自己在應用服務器中創建持久性單元,而是讓服務器為您注入持久性單元。

這就是從JavaDocs來的原因:

Persistence類在Java EE容器環境中也可用。 但是,在容器環境中不需要支持Java SE自舉API。

不知道jbos-as-7的行為如何,但是由於諸如失去JTA支持之類的原因,一般不建議這樣做。

為簡單起見,我假設您的應用程序中只有一個持久性單元。 請詢問,如果需要具有多個持久性單元的應用程序示例,我將進行編輯。

要簡單地在任何 CDI托管bean中使用實體管理器:

public class CDIBean {

  // the container injects it
  @PersistenceContext
  private EntityManager em;

  // just use it
  public void someMethod(Entity someEntity) {
    this.em.persist(someEntity);
  }

}

這里的所有都是它的。

但是,在許多示例中,出於各種原因聲明了生產者/處置者的組合。 我敢打賭這就是混亂的根源。 一些用例:

  • 允許您使用@Inject EntityManger em; 而不是@PersistenceContext EntityManager em;

     // to make it available for injection using @Inject public class CDIProducer { // again, the container injects it @PersistenceContext private EntityManager em; // this will have the default dependent scope @Produces public EntityManager em() { return em; } public void dispose(@Disposes EntityManager em) { em.close(); } } // to use it public class CDIBean { @Inject private EntityManager em; // just use it public void someMethod(Entity someEntity) { this.em.persist(someEntity); } } 
  • 或將實體管理器綁定到特定范圍。

     // to make it available for injection using @Inject, and bind it to the @RequestScope public class CDIProducer { // again, the container injects it @PersistenceContext private EntityManager em; // this will be in the request scope @Produces @RequestScoped public EntityManager em() { return em; } public void dispose(@Disposes @RequestScoped EntityManager em) { em.close(); } } // to use it public class CDIBean { @Inject private EntityManager em; // just use it public void someMethod(Entity someEntity) { this.em.persist(someEntity); } } 

最后,上述方法生產者可以轉換為現場生產者。 這等效於最后一個示例:

// to make it available for injection using @Inject, and bind it to the @RequestScope
public class CDIProducer {

  @PersistenceContext
  @Produces
  @RequestScoped
  private EntityManager em;

  public void dispose(@Disposes @RequestScoped EntityManager em) {
    em.close();
  }

}

我認為@RequestScoped不允許作為參數注入。

暫無
暫無

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

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