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
コンストラクタによってdoStuff()メソッドが呼び出されていますか?もしそうなら、@ PostConstructアノテーションはあなたに何の役にも立ちません。 –
コンストラクタとPostConstructメソッドはdoStuff()が呼び出されたときのテストのためのものでした。私はどちらかを持ちたいとは思っていませんし、私のコードをできるだけ元のコードサンプルに近づけたいと思います。 –