При создании синтетического компонента с помощью BeanConfigurator, что необходимо для внедрения?

Я создаю синтетический боб через AfterBeanDiscovery#addBean() метод.

Рассматриваемый класс Java имеет public void update(Foo foo) метод в этом. Я хочу заставить это вести себя так, как если бы оно было написано так:

@Inject
public void update(@SomeQualifier Foo foo)

... но я не могу изменить исходный код. Другими словами, я хотел бы:

  • Программно добавить @Inject к методу (или эквивалентному)
  • Программно добавить @SomeQualifier в качестве уточнения к Foo параметр (или эквивалент)
  • Заставить контейнер создавать экземпляр этого синтетического компонента "нормальным" способом, т.е. update метод будет вызываться с введенным @SomeQualifier -qualified Foo в обычном режиме CDI

Что я должен сделать, чтобы указать контейнеру, используя API-интерфейс конфигуратора бина, что мне нужно Foo параметр, чтобы быть @SomeQualifier точка инжекции, такая, что когда контейнер создает мой синтетический компонент, значение foo также будет введен правильно?

Просто звоню BeanConfigurator#addInjectionPoint(InjectionPoint) не работает, даже когда я вручную создаю InjectionPoint реализация в комплекте с @SomeQualifier в возвращаемом значении от его getQualifiers() метод.

я хотел бы использовать InjectionTargetFactory но у меня нет ручки на Bean что требует в своем createInjectionTarget(Bean) метод, так как в конце концов я нахожусь в процессе создания боба в первую очередь.

Я могу обойти это, используя более громоздкие BeanManager#createBean(BeanAttributes, Type, InjectionTargetFactory) метод, но это требует ручного создания BeanAttributes реализация. Я надеялся, что смогу сделать все это программно через API конфигуратора бина.

0 ответов

Другие вопросы по тегам