У меня есть настройки приложения для использования 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.