1

いくつかのプロパティを持つステートレス Bean があります。

  1. EJB3です
  2. クラス AddressFacade
  3. AddressFacadeRemote を実装します
  4. ejb-jar (MyJAR.jar) の中にあります
  5. それは EAR (MyEAR) にあります。

アプリケーション サーバー (Weblogic) が生成した名前 (jndiName/mappedName):

MyEARMyJAR_jarAddressFacade_AddressFacadeRemote

インジェクションは使えないので、この名前でルックアップします。

問題は、同じ EAR、JAR、クラス、およびインターフェース名を維持する場合、この名前は常に同じになるかということです。それとも、アプリケーション サーバーから変更できますか?

4

1 に答える 1

2

問題は、同じ EAR、JAR、クラス、およびインターフェース名を維持する場合、この名前は常に同じになるかということです。それとも、アプリケーション サーバーから変更できますか?

JNDI 名は Java EE 5 では標準化されておらず、アプリケーション サーバーごとに変更されます。Adam Bien は、これを説明する素晴らしい投稿を書きました。

EJB 3 の移植性の問題: JNDI 名が標準化されていないのはなぜですか?

前回の投稿で述べたように、Java EE 5 アプリケーションの移植性は、古い J2EE 1.4 の世界よりもはるかに優れています。私は 1 つの問題を発見しました。これは、定義済みで統一された JNDI ネーミングとアドレス指定の欠如です。Glassfish アプリケーション サーバー は、リモート ビジネス インターフェースの完全修飾名をデフォルトとして使用します。JBoss appserver は、"/remote" で終わる EJB の名前を使用します。したがって、次のセッション Bean:

package com.abien;

@Stateless
public class HelloWorldBean implements HelloWorld {

    public String sayHello(String hello){
        return "Echo from server: ";
    }
}

次のコード スニペットを使用して、JBoss (EJB3 サポート付き) で見つけることができます。

Context context = new InitialContext();
HelloWorld helloWorld = (HelloWorld) context.lookup("myEarName/HelloWorldBean/remote");

および Glassfish (v1 および v2) では、リモート ビジネス インターフェイスの完全修飾名を使用します。

Context context = new InitialContext();
HelloWorld helloWorld = (HelloWorld) context.lookup(HelloWorld.class.getName());

これを処理する適切な方法の 1 つはServiceLocator、「プラグ可能な」アプリケーション サーバー固有の戦略を使用することです。ServiceLocator、JNDI Naming Helper、および Java EE 5をご覧ください。

Java EE 6 では問題が修正され、最終的にPortable Global JNDI Namesが用意されました。

于 2010-09-11T07:22:03.730 に答える