Инъекция CDI в конструкторе - PullRequest
1 голос
/ 28 февраля 2012

У меня есть настройки приложения для использования CDI, и все идет хорошо. Сейчас я создаю новый bean-компонент, расширяющий класс из сторонней библиотеки. Я попытался создать что-то похожее на приведенный ниже пример:

@Named("myNewClass")
@ConversationScoped
public class MyNewClass extends ThirdPartyClass {
  @Inject
  private ApplicationConfig applicationConfig;

  @Override
  public void doStuff() {
    // In this code, applicationConfig will be null.
  }
}

Когда вызывается doStuff, applicationConfig всегда был нулевым. Я добавил конструктор без аргументов и метод, помеченный @PostConstruct, чтобы попытаться увидеть, что происходит. Затем вызывается конструктор, метод doStuff. Поскольку doStuff вызывается во время создания, я не могу использовать аннотации @Inject в этой точке.

Итак, мой вопрос, как мне заполучить applicationConfig на этом этапе?

Я возился с BeanManager (это функция, которую я вызываю с параметром ApplicationConfig.class):

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
BeanManager beanManager = (BeanManager) envCtx.lookup("BeanManager");
Bean myBean = beanManager.getBeans(clazz).iterator().next();
return beanManager.getReference(myBean, clazz, beanManager.createCreationalContext(myBean));

Что работает, но создает новый экземпляр ApplicationConfig. Я хочу получить тот, который, как я знаю, уже существует в моем ConversationScope.

Небольшая информация: я использую Seam 3.0, Weld Servlet 1.1.1, и он работает на Tomcat 6.

1 Ответ

1 голос
/ 29 февраля 2012

Вы можете аннотировать конструктор с помощью @Inject, тогда любые параметры конструктора станут точками внедрения, которые разрешит BeanManager. Это, конечно, не желаемый способ сделать это, но если это работает для вас, сделайте это.

...