在 V20.0.0.12 之前的 Liberty 中,Enterprise JavaBeans (EJB) bean 仅绑定到 java:[scope] 名称空间。EJB bean 未绑定到服务器根 Java 命名和目录接口 (JNDI) 名称空间,这意味着您无法定义 JNDI 绑定名称。在 Liberty 中,忽略了可用于在 WebSphere Application Server Traditional 中指定 JNDI 名称的 EJB 绑定属性。
在 Liberty 中,忽略了 ibm-ejb-jar-bnd.xml 文件中的以下 EJB 绑定属性。
session simple-binding-namesession component-idsession local-home-binding-namesession remote-home-binding-nameinterface binding-name在 Liberty 中,忽略了 ibm-ejb-jar-bnd.xmi 文件中的以下 EJB 绑定属性。
ejbBindings jndiName此规则将标记 20.0.0.12 之前 Liberty 中忽略的所有 JNDI 绑定名称。如果应用程序在直接 JNDI 查找中使用这些名称(而不使用 EJB 引用),那么您必须使用 Liberty V20.0.0.12 或更新版本,或者修改应用程序。
如果使用 EJB 引用,那么先前版本的 Liberty 中 Enterprise JavaBeans 查找的行为更改规则将标记必须转换为 java: 名称空间的任何 JNDI 名称(如果使用 20.0.0.12 之前的 Liberty 版本)。
如果未使用 EJB 引用并且使用的是 20.0.0.12 之前的 Liberty 版本,那么建议您使用更新版本的 Liberty,或者使用同一 JNDI 名称创建 EJB 引用,并将 EJB 引用 binding-name 设置为 java:[scope] JNDI 名称。如果未添加 EJB 引用,那么必须扫描 Java 代码以使用这些 JNDI 名称,并将查找名称转换为 java: JNDI 名称。
如果您未使用 Liberty V20.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 绑定的更多信息,请参阅 Using enterprise JavaBeans with remote interfaces on Liberty 和 EJB 3.0 and EJB 3.1 application bindings overview。