0

高速バイナリ Web サービス (別名 Ejb3.1) として記述された依存関係が多数あります。サービス宣言は次のとおりです。

@Remote
public interface MyService {...}

次の構文を使用して、EJB をサーブレットまたはマネージド Bean に注入します。

@EJB
MyService myService;

@EJBしかし、私は注射を使いたくありません。プレーンなバニラ CDI を使用したい:

@Inject
MyService myService;

@Producesこれを実現する 1 つの方法は、すべての EJB に対してメソッドを作成することです。

@Produces MyService produceMyService(InjectionPoint ijp){
 //jndi lookup for MyService interface
}

ただし、InjectionPoint は、ターゲット クラス名 (この場合は MyService) など、必要なすべての情報を提供できます。

CDI でこのようなことを行う方法はありますか? 必要な注入ポイントを他の方法で満たすことができない場合は、このプロデューサーを最後に呼び出したいと思います。

@Produces Object produce(InjectionPoint ijp){
 Class ejbInterface = ijp.getType();
 //jndi lookup for ejbInterface
}

これは紛らわしい投稿ですので、明確化のための質問をしてください。ありがとうございます!

4

1 に答える 1

3

私があなたの質問を理解したと仮定すると (コメントを参照): いいえ、このための API はありません。

良いニュースは、これを実現する方法があるということです。しかし、おそらく実行時にこれを実行したくないでしょう。それはむしろ、アプリケーションの起動時のタスクです。

CDI 拡張メカニズムは、コンテナーの起動時に Bean 処理に明確に定義されたフックをいくつか提供します。これは、(おそらく静的クラスパス情報に基づいて) 特定のマネージド Bean の有効化/無効化を決定するロジックに最適な場所です。

Seam Solderの機能と実装をご覧@Requiresください。それはあなたのユースケースにかなり近いはずです...

于 2012-06-29T20:13:34.920 に答える