2015-02-25 4 views
3

Какой самый простой способ получить InjectionPoint, когда ваш метод производителя создает компонентный компонент? По какой-то причине спецификация позволяет разрешить инъекцию InjectionPoint при производстве скошенных бобов. Есть ли простой способ сделать это или какой-то болг-запись или учебник для этого?CDI: Получение InjectionPoint при производстве скошенного компонента

Для clarifiaction, вот что Id нравится делать, но то, что запрещено в спецификации:

@Produces 
@RequestScoped 
@MyAnnotation  
private MyObject produce(InjectioPoint ip){ 
.... 
} 

ответ

5

Давайте изображения, что вы хотите сделать, это возможно. У вас есть @ApplicationScoped боб определенный:

@Produces 
@ApplicationScoped 
String produceMyString(InjectionPoint ip) {} 

И у вас есть две точки впрыска для этого боба:

@Inject 
String myString1; 

@Inject 
String myString2; 

Как боб ApplicationScoped, метод производитель будет вызван только один раз. Это приводит к выводу, что это невозможно, поскольку контейнер не может выбрать, какую точку инъекции использовать в качестве параметра метода производителя.

Это объясняет, почему доступ к метаданным InjectionPoint заставляет bean быть @Dependent. Иными словами, спецификация CDI запрещает это поведение, потому что это приводит к противоречию, а не из-за произвольного выбора.

+0

Хм, возможно, я ошибаюсь здесь, но насколько я понимаю, область действия определяет только жизненный цикл инжектируемого компонента. В этом случае производитель будет вызываться один раз для каждой точки впрыска во время жизненного цикла, но не требуется возвращать один и тот же компонент для каждой точки впрыска. Я напишу для этого тестовый файл и опубликую результаты. – PhilBa

+0

Оказывается, вы были правы; метод производителя получает только один раз. В этом случае им любопытно, возможно ли изменить поведение. Я видел, что Omnifaces, похоже, справился с этим, см. Https://github.com/omnifaces/omnifaces/blob/master/src/main/java/org/omnifaces/cdi/param/DynamicParamValueProducer.java – PhilBa

+0

В этом примере область из bean-компонента '@ Dependent', возвращаемого методом' getScope': https://github.com/omnifaces/omnifaces/blob/master/src/main/java/org/omnifaces/cdi/param/DynamicParamValueProducer.java # L88 –

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