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

Я создаю синтетический компонент с помощью метода 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 конфигуратора бина.

...