用CDI / Weld注入通用Bean

如何解决用CDI / Weld注入通用Bean

| 我只是来自很小的JavaSE / Guice世界,目前正在发现“由容器承载” -EE6的路径。在使用Glassfish3.1遇到一些麻烦之后,我刚切换到JBoss,现在面临的问题不应该是一个。 作为基础辅助课程,我试图为任何类型的实体创建通用的存储库/ DAO。以一种非常简单的方式,它可能看起来像这样。
public class Repository<E,K extends Serializable & Comparable<K>> {

    private final Instance<EntityManager> entityManagerInstance;

    protected final Class<E> getDomainObjectClass() {
        return domainObjectClass;
    }

    private final Class<E> domainObjectClass;

    protected final EntityManager getEntityManager() {
            return entityManagerInstance.get();
    }

    @Inject
    public Repository(Instance<EntityManager> entityManageryProvider,Provider<E> domainObjectProvider) {
            //This is a dirty hack,sadly :(
            domainObjectClass = (Class<E>)domainObjectProvider.get().getClass();
            this.entityManagerInstance = entityManageryProvider;
    }

    public final void persist(E domainObject) {
        final EntityManager em = getEntityManager();
        em.persist(domainObject);
    }

    public final Collection<E> getAllEntities() {
            final EntityManager em = getEntityManager();
            final CriteriaBuilder cb = em.getCriteriaBuilder();
            final CriteriaQuery<E> query = cb.createquery(getDomainObjectClass());

            final List<E> result = em.createquery(query).getResultList();
            return Collections.unmodifiableList(result);
    }

    public final E find(K id) {
            Preconditions.checkNotNull(id);
            final EntityManager em = getEntityManager();
            return em.find(getDomainObjectClass(),id);
    }

    // [...]
}
现在可能有一个不需要实体依赖查询功能的bean,而只是某种实体类型的存储库,例如(可能是测试用例):
public class DomainObjectARepositoryTest{

    @Inject
    Repository<DomainObjectA,PersistableuUID> domainObjectARepository;


    @Test
    public void testMitarbeitererstellung() {
        for (DomainObjectA a : domainObjectARepository.getAllEntities()) {
            // do cool stuff
        }       
    }
}
不幸的是,Weld似乎不喜欢这种通用的注射。在部署时,出现以下错误
state=Create: org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [Repository<DomainObjectA,PersistableuUID>] with qualifiers [@Default] at injection point [[field] @Inject sompackage.DomainObjectARepositoryTest.domainObjectARepository]
我是否缺少某些东西,或者他们只是忘记了实现通用注入?据我了解,通用的东西,无论如何都要在编译后抹掉-到目前为止,即使它在guice3中也是如此。 亲切的问候, avi 编辑:发现加文·金(Garvin King)的评论说,此行为在规范中,但未在焊缝中实现,(sta于2009年6月)     

解决方法

        这不是一个完整的答案,而是一个很长的评论,但可能会为您指明正确的方向: 很长时间以来,我一直在关注seam-dev和weld-dev中的讨论,并且不记得有这样的事情出现过。所以我的猜测是,自加文发表评论以来,它从未被列入议程。 您可以相对容易地验证此假设: (a)获得对BeanManager的引用,并为它查询相关的bean类型(或仅将side3保留在保存侧),当然,您必须从
DomainObjectARepositoryTest
中删除
@Inject
才能启动应用程序。 (b)注册一个扩展,并在部署过程中听
ProcessBean
。那是我建议的方法,您可以在这里找到更多信息。 有了这个结果,您绝对应该能够确定是否有任何类型的Bean
Repository<E,K extends Serializable & Comparable<K>>
徘徊:-) 如果您将结果报告回这里,并且还考虑在否定案例中提出Jira问题,那将很酷。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?