在 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-name
session component-id
session local-home-binding-name
session remote-home-binding-name
interface binding-name
在 Liberty 中,忽略了 ibm-ejb-jar-bnd.xmi 文件中的以下 EJB 绑定属性。
此规则将标记 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 名称。
EJB 迁移示例:
如果您未使用 Liberty V20.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 绑定的更多信息,请参阅
Using enterprise JavaBeans with remote interfaces on Liberty 和
EJB 3.0 and EJB 3.1 application bindings overview。