dwe*_*ner 7 genericdao cdi java-ee-6 jboss-weld
我刚刚来自我的小型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);
}
// [...]
}
Run Code Online (Sandbox Code Playgroud)
现在可能有一个bean不需要依赖于实体的查询功能,而只需要某个实体类型的存储库,例如(可能是测试用例):
public class DomainObjectARepositoryTest{
@Inject
Repository<DomainObjectA, PersistableUUID> domainObjectARepository;
@Test
public void testMitarbeitererstellung() {
for (DomainObjectA a : domainObjectARepository.getAllEntities()) {
// do cool stuff
}
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是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]
Run Code Online (Sandbox Code Playgroud)
我错过了什么或他们只是忘了实施仿制注射?据我所知,通用的东西,无论如何它都会在编译时被删除 - 即使这样在guice3中工作得很好.
亲切的问候,
AVI
编辑:发现garvin King 的评论,这个行为在规范中,但没有在焊接中实现,(staement是在2009年6月)
这是一个很长的评论,而不是对你的问题的完整答案,但可能会为你指明正确的方向:
我很长时间以来一直在关注接缝开发和焊接开发中的讨论,并且不记得曾经出现过类似的事情。所以我的猜测是,自从加文发表评论以来,它就没有被提上议程。
你可以做相对容易的事情来验证这个假设:
(a) 获取对 BeanManager 的引用并查询相关 bean 类型(或者只是为了Object保存),当然,您必须删除@InjectinDomainObjectARepositoryTest才能启动应用程序。
(b) 注册扩展并收听ProcessBean部署过程中发生的情况。这将是我建议的方法,您可以在这里找到更多信息。
有了这个结果,您绝对应该能够判断Repository<E, K extends Serializable & Comparable<K>>周围是否有任何 Bean 类型:-)
如果您能在此处报告结果并考虑在负面情况下提交 Jira 问题,那就太好了。
| 归档时间: |
|
| 查看次数: |
5597 次 |
| 最近记录: |