Инъекция общих бобов с помощью CDI / Weld - PullRequest
7 голосов
/ 22 июня 2011

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

1 Ответ

1 голос
/ 23 июня 2011

Это довольно длинный комментарий, а не полный ответ на ваш вопрос, но, возможно, он укажет вам правильное направление:

Я слежу за дискуссиями в seam-dev & weld-dev уже довольно давно,и не помню, чтобы что-нибудь подобное выскочило.Поэтому я думаю, что это не было в повестке дня с тех пор, как Гэвин прокомментировал это.

Что вы можете сделать относительно легко, чтобы проверить это предположение:

(a) Получить ссылкув BeanManager и запросите его для соответствующего типа компонента (или просто для Object для сохранения), конечно, вам придется удалить @Inject в DomainObjectARepositoryTest, чтобы запустить приложение.

(b) Зарегистрируйте расширение и прослушайте ProcessBean то, что появляется во время развертывания.Это был бы мой предложенный путь, вы найдете больше информации здесь .

С этим результатом вы определенно сможете определить, есть ли какие-либо типы бинов Repository<E, K extends Serializable & Comparable<K>>, которые торчат вокруг: -)

Было бы здорово, если бы вы сообщили о результатах здесь, а также рассмотрели вопрос о регистрации проблемы Jira в отрицательном случае.

...