Как указать перехватчик во время ввода - PullRequest
2 голосов
/ 13 января 2012

У меня есть несколько бобов, для которых в определенные инъекции я хочу добавить данный перехватчик.

Я наивно думал, что есть что-то вроде @Interceptors аннотации, которая может позволить мне написать

private @Interceptors(Logging.class, Connection.class) @Inject MyBean instance;

К сожалению, Документация по сварке ясно утверждает обратное.

Итак, как я могу ввести перехваченную версию моего компонента? Возможно ли использовать объект Indiance cdi?

EDIT

Хотя ответ LightGuard действительно важен, он не полностью отвечает на мой вопрос, поэтому позвольте мне перефразировать его.

Я хочу иметь аннотацию, которая запускает какую-то отправку события вызова метода. Для этого я создал CDI Interceptor, в комплекте с собственной привязкой перехватчика (скажем, перехватчик называется SenderInterceptor, а привязка называется SenderBinding). Теперь я хочу добавить спецификатор CDI (назовем его SenderQualifier), который при использовании для инъекции устанавливает SenderInterceptor.

Чтобы быть более понятным, я хочу использовать следующий код SenderInterceptor

/* calling any method of that bean should trigger an event */
private @Inject @SenderQualifier MyBean aBean;

пока этот не

private @Inject MyBean aBean;

То, что я до сих пор пробовал, было

  • обнаружение полей, требующих этих инъекций, с использованием библиотеки отражений (работает)
  • создать с использованием припоя шва AnnotatedType из класса bean-компонента (во время события BeforeBeanDiscovery) (тип создан, но не отличается от исходного) и дать AnnotatedType аннотацию привязки перехватчика.
  • создать с помощью припоя (снова) Боб из сгенерированного AnnotatedType и присвоить ему необходимую аннотацию квалификатора

Кажется, все работает, за исключением того, что вводится оригинальный боб.

Конечно, я мог бы заменить исходный перехваченным, но в некоторых случаях такой перехват не требуется, поэтому я должен оставить оба AnnotatedType ссылающихся на один и тот же конкретный тип. Я думал, что смогу сделать это в CDI, но, похоже, он не работает (так как оригинальный тип никогда не заменяется перехваченным).

Ответы [ 2 ]

2 голосов
/ 17 января 2012

Что вам нужно сделать:

  1. Добавить перехватчик в beans.xml, чтобы он активировался
  2. Создайте расширение для добавления привязки перехватчика или аннотации перехватчика к типу в ProcessAnnotatedType событии жизненного цикла. Вам нужно будет позвонить getAnnotatedType, добавить аннотацию (и), а затем позвонить setAnnotatedType. Я настоятельно рекомендую посмотреть на Seam Solder или Apache DeltaSpike проект для AnnotatedTypeBuilder, чтобы сделать это проще.
0 голосов
/ 13 января 2012

Возможно, вы могли бы попробовать @Inject MyInterceptedBean instance;, где перехватчики перечислены с MyInterceptedBean?

(Предостережение: это не выглядит правильно , хотя, используя наследование для типов, которые толькоотличаются в аннотациях ... вероятно, приемлемо, когда это всегда две указанные одинаковые аннотации и не разные аннотации в каждом случае.)

...