gpt4 book ai didi

java-ee-6 - 使用 CDI/Weld 注入(inject)通用 Bean

转载 作者:行者123 更新时间:2023-12-02 23:37:06 27 4
gpt4 key购买 nike

我刚刚从我美好的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 似乎不喜欢这种通用注入(inject)。在部署时,我收到以下错误:

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]

我是否遗漏了什么,或者他们只是忘记实现通用注入(inject)?据我了解通用的东西,无论如何,它在编译后都会被删除 - 即使到目前为止,这在 guice3 中工作得很好。

亲切的问候,

视频

编辑:找到一个comment加文·金 (garvin king) 表示,此行为已在规范中,但未在焊接中实现(声明于 2009 年 6 月)

最佳答案

这是一个很长的评论,而不是对您问题的完整答案,但可能会为您指出正确的方向:

我很长时间以来一直在关注seam-dev 和weld-dev 中的讨论,并且不记得曾经出现过类似的事情。所以我的猜测是,自从加文发表评论以来,它就没有被提上议程。

你可以做相对容易的事情来验证这个假设:

(a) 获取对 BeanManager 的引用并查询它以获取相关的 bean 类型(或者仅将 Object 放在保存端),当然您必须删除 @InjectDomainObjectARepositoryTest为了启动应用程序。

(b) 注册分机并收听 ProcessBean部署期间发生的情况。这将是我建议的方法,您会找到更多信息 here .

有了这个结果,您绝对应该能够判断是否有任何 bean 类型 Repository<E, K extends Serializable & Comparable<K>>闲逛:-)

如果您能在此处报告结果并考虑在负面情况下提交 Jira 问题,那就太好了。

关于java-ee-6 - 使用 CDI/Weld 注入(inject)通用 Bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6432812/

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