先前在 Liberty 中忽略了用户定义的 EJB 绑定位置

在 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 绑定属性。

在 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 一起进行声明,那么将得到相同功能作为建议的设置。

  1. ejb-jar.xmlweb.xml 中,必须使用引用 EJB 的类中的注释来声明引用自身。
    1. EJB 注释:
      public class TestServlet {
      @EJB(name="ejb/MyEJB")
      MyEJB myEjb;
      ....
      }

    2. 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>

  2. 如果引用的 EJB 在与其引用相同的应用程序中,那么无需 ibm-ejb-jar-bnd.xmlibm-web-bnd.xml 条目。以下一个步骤允许 EJB 容器自动链接 EJB 及其引用(如果位于相同应用程序中):

    1. 如果应用程序中仅一个 Bean 实现远程 EJB 接口,那么无需其他配置。

    2. 如果应用程序中的多个 Bean 实现远程 EJB 接口,那么必须将 beanName 元素添加到 @EJB 注释。如果使用 ejb-jar.xmlweb.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>

  3. 如果引用的 EJB 位于与其引用不同的应用程序中,那么必须完成以下一个步骤以添加查询字符串。 这些示例显示在相同服务器中运行的应用程序的查询字符串:

    1. lookup 元素添加到 @EJB 注释。如果使用 ejb-jar.xmlweb.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>

    2. ibm-ejb-jar-bnd.xmlibm-web-bnd.xml 中声明引用绑定:
      <ejb-ref name="ejb/MyEJB"
      binding-name="java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface" />
      可选择使用 lookuplookup-namebinding-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 引用:

  1. 在 Bean 位于与其引用相同的模块中时:
    public class TestEJBClient {
    public static void main(String[] args) {
    ....
    MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:module/MyEJB!com.test.MyEJBInterface");
    }
    }

  2. 在 Bean 位于与其引用相同的应用程序中时:
    public class TestEJBClient {
    public static void main(String[] args) {
    ....
    MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:app/moduleA/MyEJB!com.test.MyEJBInterface");
    }
    }

  3. 必须在相同服务器中全局查找 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