2012-02-28 18 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になりました。私はno argsコンストラクタ&を@PostConstructでタグ付けして、何が起こっているのか試してみるようにしました。コンストラクタはdoStuffメソッドから呼び出されます。構築時にdoStuffが呼び出されているので、この時点で@Injectアノテーションを使用することはできません。

ここで私はどのようにしてapplicationConfigを保留にしますか?

私は(これは私がパラメータとしてApplicationConfig.classで呼び出す機能である)BeanManagerいじりてきた:

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に既に欲しいです。

少し情報:私はシーム3.0、溶接サーブレット1.1.1を使用していますし、これはあなたがコンストラクタのいずれかのパラメータがどの注入ポイントになり、その後@Injectとコンストラクタに注釈を付けることができますTomcatの6

+2

コンストラクタによってdoStuff()メソッドが呼び出されていますか?もしそうなら、@ PostConstructアノテーションはあなたに何の役にも立ちません。 –

+0

コンストラクタとPostConstructメソッドはdoStuff()が呼び出されたときのテストのためのものでした。私はどちらかを持ちたいとは思っていませんし、私のコードをできるだけ元のコードサンプルに近づけたいと思います。 –

答えて

1

上で実行されていますBeanManagerが解決します。それは確かにそれを行う望ましい方法ではありませんが、それがあなたのために働く場合は、それのために行く。

関連する問題