Создайте спецификатор перехватчика, который игнорирует значение аннотации ()

Есть ли способ создать аннотацию квалификатора-перехватчика, которая игнорирует значение строки аннотации для квалификации?

например:

Log.java

@Inherited
@InterceptorBinding
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
    String value() default ""; // <---- ignore this
}

LogInterceptor.java

@Log
@Interceptor
public class LogInterceptor implements Serializable {

    ...
}

Usage.java

@Log("message for this log")
public String interceptedMethod(String param) {
    ...
}

Это не работает, потому что аннотация value("message for this log") работает как классификатор, но я хочу использовать value() не как классификатор, а журнал сообщений.

1 ответ

Решение

Вы можете использовать аннотацию @Nonbinding для этой цели. Вы можете заставить контейнер игнорировать член типа квалификатора, комментируя член @Nonbinding. Посмотрите на следующий пример:

@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface PayBy {
   PaymentMethod value();
   @Nonbinding String comment() default "";
}

Здесь комментарий будет игнорироваться при сопоставлении bean-компонентов квалификатором @PayBy. Ссылка на документацию CDI, описывающую это, может быть найдена здесь.

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