Использование @Inject с универсальным типом

#jsf-2 #glassfish #cdi

#jsf-2 #glassfish #cdi

Вопрос:

Я искал здесь об этом, но не нашел ответа.

В моем приложении у меня есть абстрактный основной класс для моих контроллеров с некоторыми методами и свойствами. И я хочу ввести DAO автоматически.

 abstract class AbstractController<E extends AbstractEntity, D extends AbstractDAO<E>> {
    
    @Inject
    private D dao;

    // getters and setters
}

abstract class AbstractDAO<E extends AbstractEntity> {
    @PersistentContext
    private EntityManager em;

    // finds returns E
}

// implemenation/usage

class CarController extends AbstractController<Car, CarDAO> {
}
 

Получение исключения:

 org.jboss.weld.exceptions.DefinitionException: WELD-001407 Cannot declare an injection point with a type variable: [field] @Inject private AbstractController.dao
 

Использование: Glassfish 3.1 и JSF 2.1.

Есть ли обходной путь или альтернатива для этого?

Спасибо.

Комментарии:

1. Является D ли EJB (управляемым компонентом)?

2. Используя компоненты, управляемые сеансом EJB (без состояния или с сохранением состояния), я могу получить экземпляр, используя InitialContext.lookup в методе get. Но я хочу использовать инъекцию типа @Dependent. У тебя есть для меня идея получше?

3. Guice способен справиться с подобными вещами.

4. Теперь я использую эти DAO в качестве сеансового компонента с отслеживанием состояния и получаю экземпляр с помощью контекстного поиска.

Ответ №1:

Для отражения технически очень сложно определить правильный тип среды выполнения с помощью универсального объявления в исходном коде и привести его к нему. Weld просто не поддерживает и не будет поддерживать его.

Лучше заявите об этом против AbstractDAO<E> :

 private AbstractDAO<E> dao;
 

В любом случае, вы ничего не выиграете, заявив об этом против D .

Комментарии:

1. Могу ли я с помощью Weld получить экземпляр с помощью lookup/newInstance/ … по имени класса?