Получите точный bean-компонент через CDI.current (). Select (Class, Annotation ...) с повторяемыми квалификаторами

Я не могу получить то, что хочу, при использовании CDI и аннотации @Qualifier

@Qualifier @interface для Type

@Repeatable(Type.List.class)
@Target({TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Type {

    String value();

    @Target({TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @interface List {
        Type[] value();
    }
}

и реализация AnnotationLiteral

public class TypeAL extends AnnotationLiteral<Type> implements Type {

    private final String type;

    public TypeAL(String type) {
        this.type = type;
    }

    @Override
    public String value() {
        return type;
    }
}

@Qualifier @interface для Related

@Target({TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Related {

    Class value();
}

и реализация AnnotationLiteral

public class RelatedAL extends AnnotationLiteral<Related> implements Related {

    private final Class clazz;

    public RelatedAL(Class clazz) {
        this.clazz = clazz;
    }

    @Override
    public Class value() {
        return clazz;
    }
}

Когда я комментировал что-то вот так:

@Type(TYPE_ONE)
@Type(TYPE_TWO)
@Related(RelatedClassWhichWillDoLogic.class)
public class LogicToRelatedClass implements BaseLogic {}

а когда я хочу получить CDI.current().select(BaseLogic.class, new TypeAL(TYPE_ONE), new RelatedAL(RelatedClassWhichWillDoLogic.class)), я ничего не пойду ...

Это почему?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
1 529
1

Ответы 1

какая у тебя версия CDI? Я думаю, что повторяющиеся квалификаторы поддерживаются начиная с версии 2.

https://issues.jboss.org/browse/CDI-471https://docs.google.com/document/d/1KUaxXIXJ_r-h5UJGIij6I4vrLS7uXkeeeZr2SaRipWQ/edit#

Чтобы выбрать одну реализацию из разных реализаций. мы могли бы использовать члены-квалификаторы, чтобы сузить список возможных bean-компонентов. точка внедрения должна полностью совпадать с квалификаторами bean-компонента (если вам нужен точный). у вас есть две аннотации Type в вашем классе bean-компонента, но используйте одну из них в вызове метода CDI.current (). select.

Instance<BaseLogic> findedBeans = CDI.current().select(BaseLogic.class, new TypeAL("TYPE_ONE"), new TypeAL("TYPE_TWO"), new RelatedAL(RelatedClassWhichWillDoLogic.class));

Я тестировал это в одной программе Weld Java SE. Вы можете скачать его с сайта СВАРКА (CDI) + JPA

просто в основном методе в классе App добавьте следующую строку кода.

UserApplication userApplication = container.instance()
                .select(UserApplication.class)
                .get();
        Instance<BaseLogic> type_one = CDI.current().select(BaseLogic.class, new TypeAL("TYPE_ONE"), new TypeAL("TYPE_TWO"), new RelatedAL(RelatedClassWhichWillDoLogic.class));    

Мне нужно получить этот класс на основе BaseLogic.class, new TypeAL("TYPE_ONE") и RelatedClassWhichWillDoLogic.class, но я могу получить еще одну аннотацию TypeAL

y07k2 15.12.2018 11:13

вы запускали пример, упомянутый в ответе? это сработало. в select вы указываете по крайней мере требование для выбора bean-компонента, и возможно, что он вернет больше, чем на bean-компонент (все bean-компоненты, которые удовлетворяют типу и квалификаторам)

Mehran Mastcheshmi 15.12.2018 12:17

Другие вопросы по теме