2

EJB 3 のデフォルトの JNDI 命名に関する情報がどこにあるか教えてもらえますか?

Weblogic は Glassfish のような移植可能な JNDI 名を使用しますか?

(Glassfish の場合のように) JNDI 名が使用された EJB デプロイメントの痕跡を見つけることはできますか?

例えば ​​:

  • @Remote のみのインターフェース (サービス)
  • インターフェースを実装する @Stateless のみを持つ Bean (ServiceImpl)
  • ファイルにパッケージ化されたすべて.ear(service-application-1.0)

Weblogicにデプロイするとき、私が見る唯一のJNDIリファレンスは次のとおりです。

service-application-1.0service-application-1.0_jarServiceImpl_Home

しかし、その名前をコンテキスト ルックアップで使用することはできません。私が行った場合

Service myService = (Service) context.lookup("service-application-1.0service-application-1.0_jarServiceImpl_Home");

それは私に与えます

Exception in thread "main" java.lang.ClassCastException: weblogic.ejb.container.internal.StatelessEJBHomeImpl_1035_WLStub cannot be cast to com.tuto.Service
at com.tuto.TestEjb.main(TestEjb.java:24)

PS。Glassfishを使用すると、

Portable jndi names for .... : java:global/service-application-1.0/service-application-ejb-1.0/ServiceImpl

Service myService = (Service) context.lookup("java:global/service-application-1.0/service-application-ejb-1.0/ServiceImpl");

は働いている。

4

2 に答える 2

5

残念ながら、EJB 3.0は標準のJNDI命名を指定しておらず、サーバーベンダーに任せています。あなたは、mappedNameに関するWLのドキュメントを引用することで正しいです:「この属性を指定すると、ステートレスセッションBeanは移植性がない可能性があります」。マップされた名前属性の欠点は、グローバルJNDI名がデフォルトでmappedName#FullyQualifiedRemoteInterfaceになることです。マップされた名前はソースコード内の注釈であるため、コードを移植できなくなります。推奨される方法は、weblogic-ejb-jar.xmlなどのベンダー固有のデプロイメント記述子でベンダー固有の動作を維持することです。このように、mappedName#FullyQualifiedRemoteInterfaceとして、事前に定義された形式を使用せずに独自のカスタムJNDI名を指定することもできます。

EJB 3.1は、グローバル、アプリケーション、およびモジュールレベルでJNDI名を標準化するためにいくつかの努力をしました。http://docs.oracle.com/cd/E19798-01/821-1841/girgn/index.htmlを参照してください

于 2013-02-20T06:30:37.910 に答える
1

を試すことができますcontext.lookup("ServiveImpl#com.Service");。ここで、ServiveImplは Bean のマップされた名前であり、その後#は完全修飾されたインターフェース名でなければなりません。

于 2013-02-14T10:54:51.203 に答える