在 20.0.0.12 版之前的 Liberty 中,只將 Enterprise JavaBeans (EJB) Bean 連結至 java:[scope] 名稱空間。而未將 EJB Bean 連結至伺服器根目錄的「Java 命名和目錄介面 (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 連結名稱。如果應用程式在直接 JNDI 查閱中使用這些名稱,而非使用 EJB 參照,您必須使用 Liberty 20.0.0.12 版或更新版本,或是修改應用程式。
如果您使用 EJB 參照,且使用的 Liberty 版本比 20.0.0.12 舊,則 Liberty 舊版中 Enterprise JavaBeans 查閱的行為變更規則會標示必須轉換為 java: 名稱空間的所有 JNDI 名稱。
如果您不使用 EJB 參照,且使用的 Liberty 版本比 20.0.0.12 舊,建議您使用更新版本的 Liberty,或使用相同 JNDI 名稱建立 EJB 參照,並將 EJB 參照 binding-name 設定為 java:[scope] JNDI 名稱。如果您不新增 EJB 參照,則必須掃描 Java 程式碼是否使用這些 JNDI 名稱,並將查閱名稱轉換為 java: JNDI 名稱。
如果您使用的不是 Liberty 20.0.0.12 版或更新版本,下列範例會建立 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 參照的範例。1a 或 1b 需要與 2a、2b、3a 或 3b 一起使用,才能順利鏈結 EJB 及其參照。例如,對於簡單的成功設定,建議的選項是 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 查閱。
以下是最終的 EJB 參照查閱:
|
public class TestEJBClient { public static void main(String[] args) { .... MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:comp/env/ejb/MyEJB"); } } |
或者,還有三個選項可用來直接查閱 EJB 而不使用 EJB 參照:
|
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 與遠端介面搭配使用及 EJB3.0 及 EJB 3.1 應用程式連結概觀。