2012-01-13 9 views
2

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

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

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

Unfortunatly, Weld documentation ясно заявляет обратное.

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

EDIT

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

Я хочу иметь аннотацию, которая вызывает какую-либо отправку события вызова метода. Для этого я создал 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, и придавая ему необходимого квалификатор аннотацию

Все кажется worrk, за исключением того, что это оригинальный боб, который получает инъекцию.

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

ответ

2

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

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

Впервые я когда-либо слышал об этих проектах. +1 для этого и для того, как он может быть добавлен. Тем не менее, я предполагаю, что на самом деле я должен добавить типы рядом с существующим, вместо простого их замены. – Riduidel

+0

Фактически, в моем случае 'AnnotatedTypeBuilder' должен использоваться в методе обработчика событий BeforeBeanDiscovery (поскольку' ProcessAnnotatedType' не разрешить добавление типа, но только замену типа). – Riduidel

+0

Извините, @LightGuard, но я должен отметить ваш ответ как не отвечая. – Riduidel

0

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

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

+0

Ну, в моем случае я даже не могу использовать это, так как некоторые бобы удалены друг от друга через другое расширение CDI ([JNDIExtension обсуждается здесь] (http://stackoverflow.com/a/8536437/15619)) – Riduidel

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