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