Я только что пришел из своего крошечного милого мира 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
edit: нашел комментарий Гарвина Кинга о том, что это поведение есть в спецификации, но не реализовано в сварном шве (staement было в июне 2009)