在 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-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 連結名稱。如果應用程式在直接 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 名稱。
EJB 移轉範例:
如果您使用的不是 Liberty 20.0.0.12 版或更新版本,下列範例會建立 EJB 參照來協助移轉任何查閱問題。
參照的 EJB:
@Stateless
public class MyEJB implements
MyEJBInterface {
public String
sayHello(String name) {
return "Hello 該處" + name + ".";
}
}
遠端介面:
@Remote
public interface MyEJBInterface {
String sayHello(String name);
}
EJB 參照範例:
以下是關於如何在 Liberty 中宣告 EJB 參照的範例。1a 或 1b 需要與 2a、2b、3a 或 3b 一起使用,才能順利鏈結 EJB 及其參照。例如,對於簡單的成功設定,建議的選項是 1a 和 2b,但如果將 1b 與 3b 一起進行宣告,將會得到與建議設定相同的功能。
- 在 ejb-jar.xml 或 web.xml 中,必須使用參照 EJB 的類別內的註釋來宣告參照自身。
- EJB 註釋:
public class TestServlet {
@EJB(name="ejb/MyEJB")
MyEJB myEjb;
....
}
- ejb-jar.xml 和 web.xml:
<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 與其參照(如果它們位於相同的應用程式中):
- 如果應用程式中只有一個 Bean 實作遠端 EJB 介面,則不需要其他配置。
- 如果應用程式中有多個 Bean 實作遠端 EJB 介面,則必須將
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>階段作業</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 的修改:
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>階段作業</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 中宣告參照連結:
<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 參照:
- 當 Bean 與其參照位於同一模組時:
public class TestEJBClient {
public static void
main(String[] args) {
....
MyEJBInterface myEjbInterface = (MyEJBInterface)
context.lookup("java:module/MyEJB!com.test.MyEJBInterface");
}
}
- 當 Bean 與其參照位於同一應用程式時:
public class TestEJBClient {
public static void
main(String[] args) {
....
MyEJBInterface myEjbInterface = (MyEJBInterface)
context.lookup("java:app/moduleA/MyEJB!com.test.MyEJBInterface");
}
}
- 當必須在同一伺服器內廣域尋找 Bean 定義時:
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 應用程式連結概觀。