jsf - 在泛型类中注入(inject)时 CDI 不工作 - Java

标签 jsf tomcat jpa cdi jboss-weld

我在 tomcat 上遇到 CDI 问题。那是我的代码的一些相关部分:

public class JPAUtil {
    private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("unit");

    @Produces @RequestScoped
    public static EntityManager getEntityManager() {
        return emf.createEntityManager();
    }


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

}

我的 DAO 类:

public class DAO<T> implements Serializable{

    private final Class<T> classe;

    @Inject
    protected EntityManager em;

    public DAO(Class<T> classe) {
        this.classe = classe;
    }
}

和一个子类:

public class UserDao extends DAO<User> implements Serializable{

    public UserDao() {
        super(User.class);
    }
}

由于泛型,我为 DAO 类使用了生产者:

public class DAOFactory {

    @Produces
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public DAO createDAO(InjectionPoint injectionPoint) {
        ParameterizedType type = (ParameterizedType) injectionPoint.getType();
        Class classe = (Class) type.getActualTypeArguments()[0];
        return new DAO(classe);
    }
}

在这个例子中:

public class Test {
    @Inject UserDAO userDAO;
    @Inject DAO<User> dao;
}

当我尝试使用 UserDAO 类时,一切正常,但当我使用 DAO 时,EntityManager 仍然为空。有人知道吗?

最佳答案

DAOFactory 中,您使用 new 运算符实例化 DAO,如果这样做,CDI 就没有机会在 DAO 实例中注入(inject)依赖项。 在 UserDAO 中,CDI 管理实体管理器注入(inject)。 所以在 DAOFactory 中,您应该在新创建的 DAO 实例中手动设置实体管理器。

关于jsf - 在泛型类中注入(inject)时 CDI 不工作 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10227947/

相关文章:

Java Tomcat UTF-8 问题

java - 如果联接关系位于 EmbeddedId 上,如何使用 Criteria API 联接两个表

hibernate - 如何查询以二进制形式存储在数据库中的 UUID(JPA/Hibernate/MySQL)

jsf - 是否有可能有 h :commandLink (or similar) to navigate to an URI with a fragment?

java - 从数据库中加载内容到 TreeTable

javascript - a4j :jsFunction not called from another script

jsf - Spring Security 4 和 PrimeFaces 5 AJAX 请求处理

java - 是否可以在收到请求正文之前拦截请求

java - tomcat war 部署

java - 帮助使用可重用的 JPA 事务方法(带回滚)