java - cdi 不注入(inject) entitymanager

标签 java cdi

cdi 不注入(inject) entitymanager,总是空指针。以下配置:

持久性.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

最佳答案

首先,不要在应用服务器中自己创建持久性单元,而让服务器为您注入(inject)它。

这就是为什么,来自 JavaDocs :

The Persistence class is available in a Java EE container environment as well; however, support for the Java SE bootstrapping APIs is not required in container environments.

不确定 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);
      }
    
    }
    
  • 或将实体管理器绑定(bind)到特定范围。

    // 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();
  }

}

关于java - cdi 不注入(inject) entitymanager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25861144/

相关文章:

java - 用另一种方法从textview中获取值

java - 为什么程序不给我数组的最小值?

java - 方法内语句的执行

java - 如何在 Java 中读取在线 XML 文件以获取货币汇率

java - CDI-拦截器 : Get param from intercepted Method

java - 将生成的 XSLT 数据保存到 XML 文件

java - 为什么注入(inject)的bean ApplicationScope 后面没有生产者

java - 使用库时如何强制实现特定类?

java - EJB 的 CDI 注入(inject)导致 NullPointerException

dependency-injection - 分层架构中的 CDI。如何使用 CDI 注释注入(inject)服务对象?