Расширения CDI — добавление перехватчиков на этапе ProcessAnnotatedType

Я пытаюсь добавить перехватчик программно. Перехватчик называется LogginInterceptor и просто регистрирует имя метода, на котором он работает. При использовании его с аннотацией @Interceptors(LogginInterceptor.class) к методу все работает нормально.

Однако я пытаюсь создать расширение CDI, которое программно добавляет эту аннотацию @Interceptors(LogginInterceptor) к каждому методу определенного класса (чтобы быть простым). Итак, попробуйте, я создал класс Hello с несколькими методами. Когда эти методы аннотируются вручную, LogginInterceptor работает и печатает имя метода. Однако мой код для добавления этого программно через расширения CDI не работает.

    <T> void processAnnotatedType(@Observes ProcessAnnotatedType<T> pat) {

    if (pat.getAnnotatedType().getJavaClass().equals(Hello.class)) {
        Logger.getLogger("").info("Initial annotations: " + pat.getAnnotatedType().getAnnotations());


        Map<String, Class[]> values = new HashMap<>();
        Class[] classes = {LoggingInterceptor.class};
        values.put("value", classes);
        Interceptors interceptors = AnnotationInstanceProvider.of(Interceptors.class, values);
        AnnotatedTypeBuilder<T> builder = new AnnotatedTypeBuilder<T>().readFromType(pat.getAnnotatedType());

        pat.getAnnotatedType().getMethods().forEach(method -> {
            builder.addToMethod(method, interceptors);
        });

        pat.setAnnotatedType(builder.create());
        Logger.getLogger("").info("Ending annotations: " + pat.getAnnotatedType().getAnnotations());
    }
}

Я использую Apache Deltaspike для AnnotationInstanceProvider и AnnotatedTypeBuilder. Создается аннотация, а также обертка AnnotatedType. Однако перехватчик не работает.

Я использую WildFly 9.

PS: Еще заметил, что у меня не работают привязки перехватчиков. Работает только аннотация @Interceptors.

Спасибо за любой совет.


person Community    schedule 26.12.2015    source источник


Ответы (1)


Лучше добавить экземпляр аннотации ко всему компоненту через AnnotatedTypeBuilder#addToClass. Не забудьте включить перехватчик для каждого архива (через beans.xml) или глобально через @javax.annotation.Priority. Вы даже можете динамически создать его экземпляр и добавить его в свой класс реализации перехватчика (который помечен @Interceptor). Без этого ваш @InterceptorBinding вообще не может работать.

person Dar Whi    schedule 27.12.2015
comment
Я забыл определить его как перехватчик в beans.xml. В этом была проблема. Спасибо. - person ; 31.12.2015