【问题标题】:CDI not working when Injecting in Generics class - Java在泛型类中注入时 CDI 不起作用 - Java
【发布时间】:2012-04-30 23:02:18
【问题描述】:

我在 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 仍然为空。有人知道吗?

【问题讨论】:

    标签: jsf tomcat jpa cdi jboss-weld


    【解决方案1】:

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

    【讨论】:

    • OK,将 EntityManager 传递给工厂并在 DAO 上进行设置。这样就可以了,谢谢!
    • @Montolide:请您在问题末尾的“解决方案”部分中发布更正的代码吗?
    猜你喜欢
    • 1970-01-01
    • 2015-07-14
    • 2012-07-29
    • 2014-02-17
    • 2014-08-30
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多