バージョン 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-namesession component-idsession local-home-binding-namesession remote-home-binding-nameinterface binding-nameibm-ejb-jar-bnd.xmi ファイルからの以下の EJB バインディング属性は、Liberty では無視されていました。
ejbBindings jndiNameこの規則により、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 名に変換する必要があります。
以下の例は、バージョン 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); } |
以下は、Liberty で EJB 参照を宣言する方法の例です。EJB およびその参照を正常にリンクするには、2a、2b、3a、または 3b と共に、1a または 1b のいずれかが必要です。例えば、簡単で成功するセットアップのために推奨されるオプションは 1a および 2b ですが、1b が 3b と共に宣言されている場合でも、推奨されるセットアップと同じ機能が得られます。
|
public class TestServlet { @EJB(name="ejb/MyEJB") MyEJB myEjb; .... } |
|
<ejb-ref> <ejb-ref-name>ejb/MyEJB</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <remote>com.test.MyEJBInterface</remote> <ejb-ref> |
beanName エレメントを @EJB アノテーションに追加する必要があります。ejb-jar.xml または web.xml を使用している場合、<ejb-link> エレメントを既存の <ejb-ref> エレメントに追加する必要があります。1a および 1b への変更を以下に示します。|
public class TestServlet { @EJB(name="ejb/MyEJB" beanName="MyEJB") MyEJB myEjb; .... } |
|
<ejb-ref> <ejb-ref-name>ejb/MyEJB</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <remote>com.test.MyEJBInterface</remote> <ejb-link>MyEJB</ejb-link> <ejb-ref> |
lookup エレメントを @EJB アノテーションに追加します。ejb-jar.xml または web.xml を使用している場合、<lookup-name> エレメントを既存の <ejb-ref> エレメントに追加する必要があります。1a および 1b への変更を以下に示します。
|
public class TestServlet { @EJB(name="ejb/MyEJB" lookup="java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface") MyEJB myEjb; .... } |
|
<ejb-ref> <ejb-ref-name>ejb/MyEJB</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <remote>com.test.MyEJBInterface</remote> <lookup-name>java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface</lookup-name> <ejb-ref> |
|
<ejb-ref name="ejb/MyEJB" binding-name="java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface"/> |
lookup、lookup-name、または binding-name 属性をオプションで使用できます。その場合、値は、このページの末尾に説明されている適用可能な直接 EJB ルックアップのいずれかに設定できます。
最終的な EJB 参照ルックアップは以下のようになります。
|
public class TestEJBClient { public static void main(String[] args) { .... MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:comp/env/ejb/MyEJB"); } } |
代替方法として、EJB 参照を使用せずに、EJB を直接ルックアップするための 3 つのオプションがあります。
|
public class TestEJBClient { public static void main(String[] args) { .... MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:module/MyEJB!com.test.MyEJBInterface"); } } |
|
public class TestEJBClient { public static void main(String[] args) { .... MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:app/moduleA/MyEJB!com.test.MyEJBInterface"); } } |
|
public class 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 アプリケーション・バインディングの概要』を参照してください。