2012-02-28 2 views
1

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

+2

Это метод doStuff(), вызываемый конструктором? Если это так, то аннотация @PostConstruct не делает вам ничего хорошего. –

+0

Метод contructor & PostConstruct предназначался для тестирования только тогда, когда вызывался doStuff(). Я не хочу, чтобы и я хотел, чтобы мой код был как можно ближе к исходному образцу кода. –

ответ

1

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

Смежные вопросы