gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:05:47 26 4
gpt4 key购买 nike

我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com