Как найти компоненты CDI с пользовательской аннотацией с параметрами? - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть приложение Wildfly 10, в котором я создал собственную аннотацию @Qualifer:

@Retention(RetentionPolicy.RUNTIME)
@Target({FIELD,METHOD,PARAMETER,TYPE})
@Qualifier
public @interface DbType {
    /**
     * If this DbType is part of the initialization process for an existing DB
     */
    boolean init() default false;
}

Затем у меня есть пара методов-производителей:

@Produces
@DbType
public MyBean createBean1(){
  return new MyBean();
}

@Produces
@DbType(init=true)
public MyBean createBean2(){
  return new MyBean(true);
}

В моем кодеЯ хочу программно получить все bean-компоненты с заданной аннотацией, но не знаю, как.

    Instance<MyBean> configs = CDI.current().select(MyBean.class, new AnnotationLiteral<DbType >() {});

вернет оба bean-компонента.

Как я могу указать в моем CDI.current (). Select (), что мне нужны только бины с определителем @MyType(init=true)?

1 Ответ

0 голосов
/ 15 февраля 2019

Вам нужно создать класс, который расширяет AnnotationLiteral и реализует вашу аннотацию.Пример приведен в документации AnnotationLiteral:

Поддерживает встроенную реализацию экземпляров типа аннотации.

Экземпляр типа аннотации может быть получен путем создания подкласса AnnotationLiteral.

public abstract class PayByQualifier extends AnnotationLiteral<PayBy> implements PayBy {
}

PayBy payByCheque = new PayByQualifier() {
    public PaymentMethod value() {
        return CHEQUE;
    }
};

В вашем случае это может выглядеть примерно так:

@Retention(RetentionPolicy.RUNTIME)
@Target({FIELD,METHOD,PARAMETER,TYPE})
@Qualifier
public @interface DbType {
    /**
     * If this DbType is part of the initialization process for an existing DB
     */
    boolean init() default false;

    class Literal extends AnnotationLiteral<DbType> implements DbType {

        public static Literal INIT = new Literal(true);
        public static Literal NO_INIT = new Literal(false);

        private final boolean init;

        private Literal(boolean init) {
            this.init = init;
        }

        @Override
        public boolean init() {
            return init;
        }

    }

}

А затем использовать его:

Instance<MyBean> configs = CDI.current().select(MyBean.class, DbType.Literal.INIT);
...