Объявите @Inject как конкретную реализацию возвращаемого интерфейса @Produces

Есть ли способ внедрить конкретную реализацию возвращаемого интерфейса @Produces?

SomeClassImpl implements SomeClass {
    public Integer iField;
}

Класс производителя:

@Produces
public SomeClass produceChild(){
    SomeClassImpl impl = new SomeClassImpl();
    impl.iField = 17;
    return impl;
}

Класс потребления:

@Inject SomeClassImpl classImpl;

ИЗМЕНИТЬ

Попытка @Inject SomeClassImpl не заставляет контейнер использовать метод @Produces, который возвращает супертип SomeClass.

Почему можно внедрить дочерний тип через @Inject parent-type (без Producer), но нет вариантов внедрить дочерний тип через @Produces parent-type ?


person uptoyou    schedule 15.05.2016    source источник
comment
Используйте квалификаторы, если у вас более одной реализации интерфейса.   -  person ares    schedule 15.05.2016
comment
См. этот ответ.   -  person blacktide    schedule 15.05.2016
comment
Что касается вашего редактирования, поскольку ваш метод @Produces создает экземпляр SomeClass, а не экземпляр SomeClassImpl, который может возвращать любую реализацию SomeClass, а не только экземпляры SomeClassImpl. Вы можете исправить это, внедрив SomeClass (а не реализацию) и используя квалификатор, или изменив метод @Produces, чтобы он возвращал SomeClassImpl.   -  person blacktide    schedule 15.05.2016
comment
Я понял, спасибо, но мне нужно ввести именно тип SomeClassImpl с помощью метода Produces. Если это невозможно - скажите, пожалуйста Это невозможно! знак равно   -  person uptoyou    schedule 15.05.2016


Ответы (1)


Вы можете использовать @Typed для управления допустимыми типами для вашего bean-компонента. https://docs.jboss.org/cdi/api/1.0/javax/enterprise/inject/Typed.html

person John Ament    schedule 15.05.2016