Я создаю синтетический компонент с помощью метода AfterBeanDiscovery#addBean()
.
В рассматриваемом Java-классе есть метод public void update(Foo foo)
.Я хочу, чтобы все было так, как если бы оно было написано так:
@Inject
public void update(@SomeQualifier Foo foo)
… но я не могу изменить исходный код.Другими словами, я хотел бы:
- Программно добавить
@Inject
к методу (или эквивалентному) - Программно добавить
@SomeQualifier
в качестве квалификатора к Foo
параметр (или эквивалентный) - Заставить контейнер создавать экземпляр этого синтетического компонента "обычным" способом, то есть метод
update
будет вызываться с введенным @SomeQualifier
-качественным Foo
в нормальном CDIfashion
Что я должен сделать, чтобы указать контейнеру, используя API-интерфейсы bean-конфигуратора, что я хотел бы, чтобы тип с типом Foo
представлял собой @SomeQualifier
квалифицированную инъекциючто, когда контейнер создает мой синтетический компонент, значение foo
также будет правильно введено?
Простой вызов BeanConfigurator#addInjectionPoint(InjectionPoint)
не работает, даже когда я вручную создаю InjectionPoint
реализация завершена с @SomeQualifier
в возвращаемом значении его getQualifiers()
метода.
Я бы использовал InjectionTargetFactory
, но у меня нет дескриптора на Bean
, который требуется в его createInjectionTarget(Bean)
метод, так как в конце концов я впроцесс создания компонента в первую очередь.
Я могу обойти это, используя более громоздкий метод BeanManager#createBean(BeanAttributes, Type, InjectionTargetFactory)
, но для этого необходимо вручную создать реализацию BeanAttributes
.Я надеялся, что смогу сделать все это программно через API конфигуратора бина.