在Generics类中注入时,CDI不工作 - Java

Mon*_*ide 1 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();
    }

}
Run Code Online (Sandbox Code Playgroud)

我的DAO课程:

public class DAO<T> implements Serializable{

    private final Class<T> classe;

    @Inject
    protected EntityManager em;

    public DAO(Class<T> classe) {
        this.classe = classe;
    }
}
Run Code Online (Sandbox Code Playgroud)

和一个儿童班:

public class UserDao extends DAO<User> implements Serializable{

    public UserDao() {
        super(User.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

由于Generics,我使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中:

public class Test {
    @Inject UserDAO userDAO;
    @Inject DAO<User> dao;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用UserDAO类时,一切正常,但是当我使用DAO时,EntityManager仍为null.任何人都有任何想法?

lan*_*l79 5

DAOFactory使用new运算符实例化DAO时,如果这样做,CDI将无法在DAO实例中注入依赖项.而在UserDAOCDI中管理实体管理器注入.因此,DAOFactory您应该在新创建的DAO实例中手动设置实体管理器.