2

私はEJB3.1仕様を調べており、JNDI呼び出しを行うためのさまざまな可能な方法を把握しようとしています。

これは、 SessionContextInitialContext(またはInitial-またはSessionContextに基づいて自己作成されたコンテキスト)を使用して実行できます。どちらを使用するかによって構文は異なりますが、その背後にあるロジックを見つけることができないようです。

だから私の質問は、EJBコンテナ環境内でJNDI呼び出しを使用するためにどの構文をいつ使用できるかということです。

この質問の残りの部分は、私の要点を説明するためのものです。

たとえば、これは正しく注入sessioncontextまたは作成された場合は常に可能であると私は信じていinitialcontextます。

ctx.lookup(java:global[/<app-name>]/<module-name>/<bean-name>[!<fully-qualified-interface-name>])
ctx.lookup(java:comp/env ...)
// special ones like these
ctx.lookup("java:comp/UserTransaction");
ctx.lookup("java:comp/ORB");

時々(セッションコンテキストのみ?)この短いバージョンが可能です:

ctx.lookup(<bean-name>);

ではどうですか、参照embedded environmentのみglobalを使用できますか?

4

2 に答える 2

2

私は通常、@EJB アノテーションを使用して EJB コンテナー内に EJB を注入します。そのため、JDNI ルックアップはデプロイ時にサーバーによって行われます。

JBOSS デプロイメントの例:

INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC サービス スレッド 1-2) デプロイメント「MyProject.ear」のデプロイメント ユニット サブデプロイメント「MyEJB.jar」の TestBean という名前のセッション Bean の JNDI バインディングは次のとおりです。 :

java:global/MyProject/MyEJB/TestBean!my.project.TestBean
java:app/MyEJB/TestEJB!my.project.TestBean
java:module/TestEJB!my.project.TestBean
java:global/MyProject/MyEJB/TestEJB
java:app/MyEJB/TestBean
java:module/TestBean

EJB 仕様ごとのものもあれば、アプリケーション サーバーに依存するものもあります。

コンテキストからルックアップを作成する必要がある場合、最善の方法はjava:globalを使用することだと思います。

http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#POJOLocalEJBにも追加情報があります。

于 2013-03-06T19:09:50.543 に答える
2

jndi はファイル システムに少し似ています。ツリー内の現在の場所 (「cd」した場所) に基づいた相対パスを使用して参照できます。

注入されたセッション コンテキストは、デフォルトで java:comp に「配置」されるため、「フル パス」を指定する必要なく、java:comp で使用できるものを参照できます。

java:comp 自体は単一の EJB Bean に関連していること、または歴史的な理由から Web モジュール全体に関連していることに注意してください。

組み込み環境で何を意味するのか100%わかりませんが、JNDIルックアップを実行しているコードが事前定義されたスコープ(java:module、java:appなど)の一部ではない場合、Javaのみ: global はポータブルに使用できます。

于 2013-03-11T09:36:51.123 に答える