У меня есть настройка моего приложения для использования CDI, и все идет хорошо. Теперь я создаю новый компонент, который расширяет класс из сторонней библиотеки. Я пытался создать что-то вроде на примере ниже:CDI Injection Within A Constructor
@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 всегда был нулевым. Я добавил конструктор no args & метод, помеченный с помощью @PostConstruct, чтобы посмотреть, что происходит. Конструктор вызывает метод doStuff. Поскольку doStuff вызывается во время построения, я не могу использовать аннотации @Inject в этой точке.
Итак, мой вопрос в том, как я могу удержать приложениеConfig на этом этапе?
Я мастерить с 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. Я хочу получить тот, который, как я знаю, уже существует на моем устройстве «Разговор».
Немного информации: Я использую Seam 3.0, Weld Servlet 1.1.1 и это работает на Tomcat 6.
Это метод doStuff(), вызываемый конструктором? Если это так, то аннотация @PostConstruct не делает вам ничего хорошего. –
Метод contructor & PostConstruct предназначался для тестирования только тогда, когда вызывался doStuff(). Я не хочу, чтобы и я хотел, чтобы мой код был как можно ближе к исходному образцу кода. –