2015-11-05 5 views
-2

У меня есть проблемы похожих цитируемых в this post:CDI транзакционный Перехватчик не работает с CDI Производителем

Но, мне нужно использовать метод производителя для создания сложного объекта (этот объект получить два Params в конструкторе). Использование метода производителя для потери ссылки на перехватчик. Я не нашел ничего в спецификации CDI, который сказал, что перехватчики не выполняются на объектах, генерируемых методами производителя.

Мой вопрос: Его возможный метод использования производителя и поддержание ссылки на перехватчики?

+1

Если у вас есть та же проблема, ответ на другой вопрос должен ответить на ваш вопрос. Если у вас другая проблема, отправьте фрагменты кода, то, что вы пробовали, и какие ошибки вы получите, чтобы помочь людям ответить на ваш вопрос. На ваш вопрос очень сложно ответить. См. Также http://stackoverflow.com/help/how-to-ask – Buurman

+0

Я редактирую вопрос, чтобы очистить его. – Luciano

ответ

0

CDI-перехватчики и декораторы применяются только к фасоли, которые создаются контейнером CDI.

Однако, есть уродливое обходное решение. Это немного технично, но медведь со мной. Я пишу это в основном без IDE, поэтому я извиняюсь за опечатки и т. Д., Это просто дать вам представление.

Сначала вам нужно создать спецификатор

@Qualifier 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ ElementType.FIELD, ElementType.PARAMETER}) 
public @interface InjectionParameter { 
    int value(); 
} 

Затем вам нужно аннотировать специальный конструктор, как это:

@Inject 
public MyClass(@InjectionParameter(1) Object firstParam, @InjectionParameter(2) Object secondParameter) 

Тогда для производителя вы говорите,

@Inject 
private Instance<MyClass> myClassInstance; 

@Produces 
@InjectionParameter(1) 
Object firstParam; 

@Produces 
@InjectionParameter(2) 
Object secondParam; 

@Produces MyClass producer() { 
    firstParam = null; /* set your first param here */ 
    secondParam = null; /* set your second param here */ 
    return myClassInstance.get(); 
} 

Обратите внимание, что мое использование объекта было всего лишь примером, пожалуйста, замените его собственными фактическими типами :)

Дело в том, что контейнер CDI CAN может создавать экземпляры beans, которые не имеют конструктора по умолчанию, если соответствующий конструктор аннотируется с помощью @Inject , и каждый параметр является допустимым целевым объектом для инъекций. Что я там сделал, были настроены параметры вашего компонента по полям производителя.

Обратите внимание, что я фактически не тестировал это с контейнером CDI, поэтому вам, возможно, придется точно настроить решение. Вы можете получить двусмысленное преобразование бобов между методом производителя и самим компонентом, которые вы можете решить, добавив еще один классификатор в bean-компонент и в поле экземпляра производителя.

Надеюсь, это поможет. -Juuso

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