Получить точный бин с помощью CDI.current (). Select (Class, Annotation ...) с повторяющимися квалификаторами - PullRequest
0 голосов
/ 22 ноября 2018

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

Почему это?

1 Ответ

0 голосов
/ 03 декабря 2018

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

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

Чтобы выбрать одну реализацию между различными реализациями.мы могли бы использовать члены-квалификаторы, чтобы сузить список возможных бинов.точка впрыска должна быть полностью согласована с квалификаторами на бобе (если вы хотите точный).у вас есть две аннотации типа в вашем классе компонентов, но одна из них используется в вашем вызове метода 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.Вы можете скачать его с WELD (CDI) + JPA

просто в методе main, в классе 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));    

enter image description here

...