バージョン 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 では無視されていました。
session simple-binding-name
session component-id
session local-home-binding-name
session remote-home-binding-name
interface binding-name
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-name を java:[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 と共に宣言されている場合でも、推奨されるセットアップと同じ機能が得られます。
- 参照自体は、ejb-jar.xml または web.xml 内で、EJB を参照しているクラス内でアノテーションを使用して宣言される必要があります。
- EJB アノテーション:
< span class="Code"> < span class= "JavaKeyword"> 公開クラス < /span> < span class="JavaType">TestServlet< /span> {
@EJB(name="ejb/MyEJB")
MyEJB myEjb;
....
}
- 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>
- 参照される EJB が、その参照と同じアプリケーション内にある場合、ibm-ejb-jar-bnd.xml または ibm-web-bnd.xml 項目は必要ありません。以下のいずれかのステップで、EJB コンテナーは EJB とその参照とを、それらが同じアプリケーションにある場合は自動的にリンクできるようになります。
- アプリケーション内の 1 つのみの Bean がリモート EJB インターフェースを実装している場合、追加構成は不要です。
- アプリケーション内の複数の 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>
- 参照される EJB がその参照とは異なるアプリケーション内にある場合、以下のいずれかのステップを実行してルックアップ・ストリングを追加する必要があります。
以下の例は、同じサーバーで稼働しているアプリケーションのルックアップ・ストリングを示します。
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>
- 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 に対して、lookup、lookup-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 つのオプションがあります。
- 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");
}
}
- 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");
}
}
- 同じサーバー内でグローバルに 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 アプリケーション・バインディングの概要』を参照してください。