Я только что пришел из моего крошечного красивого мира JavaSE / Guice и в настоящее время обнаруживаю путь «переносится контейнером» -EE6. После некоторых проблем с Glassfish3.1 я просто переключился на JBoss и теперь столкнулся с проблемой, которой не должно быть.
Как вспомогательный инфраструктурный класс, я пытаюсь создать общий репозиторий / DAO для любого типа объекта. В очень простой форме это может выглядеть так.
public class Repository> {
private final Instance entityManagerInstance;
protected final Class getDomainObjectClass() {
return domainObjectClass;
}
private final Class domainObjectClass;
protected final EntityManager getEntityManager() {
return entityManagerInstance.get();
}
@Inject
public Repository(Instance entityManageryProvider, Provider domainObjectProvider) {
//This is a dirty hack, sadly :(
domainObjectClass = (Class)domainObjectProvider.get().getClass();
this.entityManagerInstance = entityManageryProvider;
}
public final void persist(E domainObject) {
final EntityManager em = getEntityManager();
em.persist(domainObject);
}
public final Collection getAllEntities() {
final EntityManager em = getEntityManager();
final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery query = cb.createQuery(getDomainObjectClass());
final List 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 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] with qualifiers [@Default] at injection point [[field] @Inject sompackage.DomainObjectARepositoryTest.domainObjectARepository]
Я что-то упустил, или они просто забыли реализовать общие инъекции? Насколько я понимаю общий материал, он все равно стирается после компиляции - до сих пор даже это прекрасно работало в guice3.
С уважением,
avi
edit: нашел комментарий Гарвин Кинг, что такое поведение предусмотрено спецификацией, но не реализовано в сварном шве (версия была в июне 2009 г.)