Как указать перехватчик во время ввода

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

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

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

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

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

ИЗМЕНИТЬ

Хотя ответ 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 аннотацию привязки перехватчика.
  • создать с помощью шовной пайки (снова) объект Bean из сгенерированного AnnotatedType и присвоить ему необходимую аннотацию квалификатора

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

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


person Riduidel    schedule 13.01.2012    source источник


Ответы (2)


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

  1. Добавьте перехватчик в beans.xml, чтобы он активировался
  2. Создайте расширение, чтобы добавить привязку перехватчика или аннотацию перехватчика к типу в _ 1_ событие жизненного цикла. Вам нужно будет вызвать getAnnotatedType, добавить аннотацию (аннотации), а затем вызвать setAnnotatedType. Я настоятельно рекомендую посмотреть Seam Solder или Apache DeltaSpike для AnnotatedTypeBuilder, чтобы упростить эту задачу.
person LightGuard    schedule 16.01.2012
comment
Я впервые слышу об этих проектах. +1 за это и за то, как это можно было добавить. Однако я полагаю, что на самом деле мне следует добавить типы рядом с существующим, вместо того, чтобы просто заменять их. - person Riduidel; 17.01.2012
comment
Фактически, в моем случае AnnotatedTypeBuilder следует использовать в BeforeBeanDiscovery методе обработчика событий (поскольку ProcessAnnotatedType не позволяет добавлять типы, а только заменять типы). - person Riduidel; 17.01.2012
comment
Извините, @LightGuard, но я должен отметить ваш ответ как не отвечающий. - person Riduidel; 17.01.2012
comment
Вы можете заменить тип новой аннотацией, это то, что вы хотите сделать в любом случае. Добавление нового типа приведет к исключению двусмысленности. - person LightGuard; 23.01.2012
comment
Да, но в этом случае у меня будет доступ только к перехваченному классу, хотя я хочу иметь возможность использовать оба типа. Я уже думал об этом, и у меня есть код в перехватчике для обработки или не внедренных экземпляров, но это не решает мою проблему. Позвольте мне немного отредактировать свой вопрос, чтобы уточнить, что я хочу делать. - person Riduidel; 24.01.2012
comment
Хорошо, теперь я понимаю лучше. Нет, то, что вы хотите сделать, невозможно, вам придется аннотировать исходный тип или создать новый аннотированный тип на основе конкретного типа. Конечно, вам нужно будет добавить квалификатор к типу и инъекции, чтобы убедиться, что вы вводите правильный экземпляр. Для этой части подходит стереотип. - person LightGuard; 24.01.2012

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

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

person mgaert    schedule 13.01.2012
comment
Что ж, в моем случае я даже не могу это использовать, поскольку некоторые bean-компоненты являются удаленными, доступ к которым осуществляется через другое расширение CDI (обсуждалось расширение JNDIE здесь) - person Riduidel; 16.01.2012