2015-12-26 3 views
0

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

Однако я пытаюсь создать расширение 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.

Благодарим вас за любые советы.

ответ

0

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

+0

Я забыл определить его как перехватчик в beans.xml. Это была проблема. Спасибо. –

Смежные вопросы