Я не могу получить то, что хочу, при использовании 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)), я ничего не пойду ...
Это почему?




какая у тебя версия 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));
вы запускали пример, упомянутый в ответе? это сработало. в select вы указываете по крайней мере требование для выбора bean-компонента, и возможно, что он вернет больше, чем на bean-компонент (все bean-компоненты, которые удовлетворяют типу и квалификаторам)
Мне нужно получить этот класс на основе
BaseLogic.class,new TypeAL("TYPE_ONE")иRelatedClassWhichWillDoLogic.class, но я могу получить еще одну аннотациюTypeAL