Внедрение универсальных бинов с помощью CDI / Weld

Я только что пришел из моего крошечного красивого мира 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 г.)

7
задан dwegener 22 June 2011 в 09:22
поделиться