ユーザー定義の EJB バインディング・ロケーションは以前は Liberty では無視されていた

バージョン 20.0.0.12 より前の Liberty では、Enterprise JavaBeans (EJB) Bean は java:[scope] 名前空間にのみバインドされていました。EJB Bean はサーバー・ルート Java Naming and Directory Interface (JNDI) 名前空間にはバインドされませんでした。これは、JNDI バインディング名を定義できなかったことを意味します。WebSphere Application Server traditional でユーザーが JNDI 名を指定することができる EJB バインディング属性は、Liberty では無視されていました。

ibm-ejb-jar-bnd.xml ファイルからの以下の EJB バインディング属性は、Liberty では無視されていました。

ibm-ejb-jar-bnd.xmi ファイルからの以下の EJB バインディング属性は、Liberty では無視されていました。

この規則により、20.0.0.12 より前の Liberty で無視されたすべての JNDI バインディング名にフラグが立てられます。アプリケーションが EJB 参照を使用するのではなく、直接 JNDI 検索でこれらの名前を使用している場合、20.0.0.12 以降のバージョンの Liberty を使用するか、アプリケーションを変更する必要があります。

EJB 参照を使用している場合、「旧バージョンの Liberty での Enterprise JavaBeans のルックアップでの振る舞いの変更」規則によって、20.0.0.12 より前のバージョンの Liberty を使用しているときには java: 名前空間に変換する必要のあるすべての JNDI 名にフラグが立てられます。

20.0.0.12 より前のバージョンの Liberty を使用しており、EJB 参照を使用していない場合、新規バージョンの Liberty を使用するか、同じ JNDI 名で EJB 参照を作成し、その EJB 参照の binding-namejava:[scope] JNDI 名に設定することをお勧めします。EJB 参照を追加しない場合は、Java コードをスキャンしてこれらの JNDI 名の使用を検出し、ルックアップ名を java: JNDI 名に変換する必要があります。


EJB のマイグレーション例:

以下の例は、バージョン 20.0.0.12 以降の Liberty を使用していない場合に、ルックアップのマイグレーションに関する問題を支援するため、EJB 参照を作成します。

参照される EJB:

@Stateless
public class MyEJB implements MyEJBInterface {
public String sayHello(String name) {
return 「Hello there」 + name + ".";
}
}

リモート・インターフェース:

@Remote
public interface MyEJBInterface {
String sayHello(String name);
}

EJB 参照の例:

以下は、Liberty で EJB 参照を宣言する方法の例です。EJB およびその参照を正常にリンクするには、2a、2b、3a、または 3b と共に、1a または 1b のいずれかが必要です。例えば、簡単で成功するセットアップのために推奨されるオプションは 1a および 2b ですが、1b が 3b と共に宣言されている場合でも、推奨されるセットアップと同じ機能が得られます。

  1. 参照自体は、ejb-jar.xml または web.xml 内で、EJB を参照しているクラス内でアノテーションを使用して宣言される必要があります。
    1. EJB アノテーション:
      < span class="Code"> < span class= "JavaKeyword"> 公開クラス < /span> < span class="JavaType">TestServlet< /span> {
      @EJB(name="ejb/MyEJB")
      MyEJB myEjb;
      ....
      }

    2. ejb-jar.xml and web.xml:
      < span class="Code"> < ejb-ref>
      <ejb-ref-name>EJB/MyEJB</ejb-ref-name>
      <ejb-ref-type>セッション</ejb-ref-type>
      <remote>com.test.MyEJBInterface</remote>
      <ejb-ref>

  2. 参照される EJB が、その参照と同じアプリケーション内にある場合、ibm-ejb-jar-bnd.xml または ibm-web-bnd.xml 項目は必要ありません。以下のいずれかのステップで、EJB コンテナーは EJB とその参照とを、それらが同じアプリケーションにある場合は自動的にリンクできるようになります。

    1. アプリケーション内の 1 つのみの Bean がリモート EJB インターフェースを実装している場合、追加構成は不要です。

    2. アプリケーション内の複数の Bean がリモート EJB インターフェースを実装している場合、beanName エレメントを @EJB アノテーションに追加する必要があります。ejb-jar.xml または web.xml を使用している場合、<ejb-link> エレメントを既存の <ejb-ref> エレメントに追加する必要があります。1a および 1b への変更を以下に示します。
      < span class="Code"> < span class= "JavaKeyword"> 公開クラス < /span> TestServlet {
      @EJB(name="ejb/MyEJB" beanName="MyEJB")
      MyEJB myEjb;
      ....
      }

      < span class="Code"> < ejb-ref>
      <ejb-ref-name>EJB/MyEJB</ejb-ref-name>
      <ejb-ref-type>セッション</ejb-ref-type>
      <remote>com.test.MyEJBInterface</remote>
      <ejb-link>MyEJB</ejb-link>
      <ejb-ref>

  3. 参照される EJB がその参照とは異なるアプリケーション内にある場合、以下のいずれかのステップを実行してルックアップ・ストリングを追加する必要があります。 以下の例は、同じサーバーで稼働しているアプリケーションのルックアップ・ストリングを示します。

    1. lookup エレメントを @EJB アノテーションに追加します。ejb-jar.xml または web.xml を使用している場合、<lookup-name> エレメントを既存の <ejb-ref> エレメントに追加する必要があります。1a および 1b への変更を以下に示します。
      < span class="Code"> < span class= "JavaKeyword"> 公開クラス < /span> TestServlet {
      @EJB(name="ejb/MyEJB" lookup="java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface")
      MyEJB myEjb;
      ....
      }

      < span class="Code"> < ejb-ref>
      <ejb-ref-name>EJB/MyEJB</ejb-ref-name>
      <ejb-ref-type>セッション</ejb-ref-type>
      <remote>com.test.MyEJBInterface</remote>
      <lookup-name>java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface</lookup-name>
      <ejb-ref>

    2. ibm-ejb-jar-bnd.xml または ibm-web-bnd.xml 内で参照バインディングを宣言します。
      < span class="Code"> < ejb-ref name="ejb/MyEJB"
      binding-name="java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface" />
      同じアプリケーション内で、参照する EJB に対して、lookuplookup-name、または binding-name 属性をオプションで使用できます。その場合、値は、このページの末尾に説明されている適用可能な直接 EJB ルックアップのいずれかに設定できます。

最終的な EJB 参照ルックアップは以下のようになります。

< span class="Code"> < span class= "JavaKeyword"> 公開クラス < /span> TestEJBClient {
public static void main(String[] args) {
....
MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:comp/env/ejb/MyEJB");
}
}

代替方法として、EJB 参照を使用せずに、EJB を直接ルックアップするための 3 つのオプションがあります。

  1. Bean がその参照と同じモジュール内にある場合:
    < span class="Code"> < span class= "JavaKeyword"> 公開クラス < /span> TestEJBClient {
    public static void main(String[] args) {
    ....
    MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:module/MyEJB!com.test.MyEJBInterface");
    }
    }

  2. Bean がその参照と同じアプリケーション内にある場合:
    < span class="Code"> < span class= "JavaKeyword"> 公開クラス < /span> TestEJBClient {
    public static void main(String[] args) {
    ....
    MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:app/moduleA/MyEJB!com.test.MyEJBInterface");
    }
    }

  3. 同じサーバー内でグローバルに Bean 定義が検出される必要がある場合:
    < span class="Code"> < span class= "JavaKeyword"> 公開クラス < /span> TestEJBClient {
    public static void main(String[] args) {
    ....
    MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface");
    }
    }

EJB バインディングの使用について詳しくは、『Liberty でのリモート・インターフェースによる Enterprise JavaBeans の使用』および『EJB 3.0 および EJB 3.1 アプリケーション・バインディングの概要』を参照してください。