2012-02-28 92 views
1

我的應用程序設置使用CDI,並且一切順利。現在我正在創建一個從第三方庫擴展類的新bean。我試圖創建類似下面的示例:構造函數中的CDI注入

@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始終爲null。我添加了一個沒有參數的構造函數&用@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,虛焊的Servlet 1.1.1,這是在Tomcat 6,運行

+2

是由構造函數調用的doStuff()方法嗎?如果是這樣,那麼@PostConstruct註釋對你沒有任何好處。 – 2012-02-28 16:03:50

+0

構造函數&PostConstruct方法純粹用於在調用doStuff()時進行測試。我不想讓我的代碼儘可能接近原始代碼示例。 – 2012-02-29 14:02:29

回答

1

您可以用標註一@注入構造,則構造成爲注射點的任何參數, BeanManager將解析。這當然不是所希望的方式,但如果它適合你,就去做吧。