Las ubicaciones de enlaces EJB definidas por el usuario se ignoraron anteriormente en Liberty

En Liberty anterior a la versión 20.0.0.12, los beans Enterprise JavaBeans (EJB) están enlazados solo al espacio de nombres java:[scope]. Los beans EJB no estaban enlazados a un espacio de nombres Java Naming and Directory Interface (JNDI) raíz del servidor, lo que significa que no se han podido definir los nombres de enlace JNDI. Los atributos de enlaces EJB que le permite especificar el nombre JNDI en WebSphere Application Server tradicional se han ignorado en Liberty.

Los siguientes atributos de enlaces EJB del archivo ibm-ejb-jar-bnd.xml se han ignorado en Liberty.

Los siguientes atributos de enlace EJB del archivo ibm-ejb-jar-bnd.xmi se han ignorado en Liberty.

Esta regla señala todos los nombres de enlace JNDI que se han ignorado en Liberty antes de 20.0.0.12. Si la aplicación utiliza estos nombres en búsquedas JNDI directas en lugar de utilizando referencias EJB, debe utilizar la versión de Liberty 20.0.0.12 o posterior, o modificar la aplicación.

Si utiliza referencias EJB, la regla Cambio de comportamiento en búsquedas de Enterprise JavaBeans en versiones anteriores de Liberty señala todos los nombres JNDI que se deben convertir al espacio de nombres java: si se utiliza una versión de Liberty anterior a la versión 20.0.0.12.

Si no utiliza referencias EJB y está utilizando una versión de Liberty anterior a la versión 20.0.0.12, se recomienda utilizar una versión más reciente de Liberty o crear una referencia EJB utilizando el mismo nombre JNDI y establecer la referencia EJB binding-name en el nombre JNDI java:[scope]. Si no añade una referencia EJB, debe explorar en el código Java el uso de estos nombres JNDI y convertir el nombre de búsqueda al nombre JNDI java:.


Ejemplo de migración de EJB:

El siguiente ejemplo crea una referencia EJB para ayudar a migrar cualquier problema de búsqueda si no está utilizando la versión de Liberty 20.0.0.12 o posterior.

EJB referenciado:

@Stateless
public class MyEJB implements MyEJBInterface {
public String sayHello(String name) {
return "Hola ahí" + nombre + ".";
}
}

Interfaz remota:

@Remote
public interface MyEJBInterface {
String sayHello(String name);
}

Ejemplos de referencia de EJB:

A continuación, se muestran ejemplos sobre cómo declarar una referencia de EJB en Liberty. 1a o 1b son necesarios en conjunción de 2a, 2b, 3a o 3b para enlazar correctamente un EJB y su referencia. Por ejemplo, las opciones recomendadas son 1a y 2b para una configuración fácil y satisfactoria, pero si 1b se declara en conjunción con 3b, obtendrá la misma funcionalidad que la configuración recomendada.

  1. La propia referencia debe declararse utilizando una anotación dentro de la clase que hace referencia al EJB, en ejb-jar.xml o en web.xml.
    1. Anotación EJB:
      < span class="Code"> < span class= "JavaKeyword"> clase pública < /span> < span class="JavaType">TestServlet< /span> {
      @EJB(name="ejb/MyEJB")
      MyEJB myEjb;
      ....
      }

    2. ejb-jar.xml y web.xml:
      < span class="Code"> < ejb-ref>
      <ejb-ref-name>ejb/MyEJB</ejb-ref-name>
      <ejb-ref-type>Sesión</ejb-ref-type>
      <remote>com.test.MyEJBInterface</remote>
      <ejb-ref>

  2. Si el EJB referenciado se encuentra en la misma aplicación que su referencia, no es necesario una entrada ibm-ejb-jar-bnd.xml ni ibm-web-bnd.xml. Uno de los pasos siguientes permitirá que el Contenedor EJB enlace automáticamente el EJB y su referencia si se encuentran en la misma aplicación:

    1. Si sólo un bean de la aplicación implementa la interfaz EJB remota, no es necesario realizar ninguna configuración adicional.

    2. Si varios beans en la aplicación implementan la interfaz EJB remota, se debe añadir el elemento beanName a la anotación @EJB. Si se utiliza ejb-jar.xml o web.xml, se debe añadir el elemento <ejb-link> al elemento <ejb-ref>. Las modificaciones de 1a y 1b se muestran aquí:
      < span class="Code"> < span class= "JavaKeyword"> clase pública < /span> TestServlet {
      @EJB(name="ejb/MyEJB" beanName="MyEJB")
      MyEJB myEjb;
      ....
      }

      < span class="Code"> < ejb-ref>
      <ejb-ref-name>ejb/MyEJB</ejb-ref-name>
      <ejb-ref-type>Sesión</ejb-ref-type>
      <remote>com.test.MyEJBInterface</remote>
      <ejb-link>MyEJB</ejb-link>
      <ejb-ref>

  3. Si el EJB referenciado se encuentra en una aplicación distinta a la de su referencia, se debe completar uno de los pasos siguientes para añadir una serie de búsqueda. Estos ejemplos muestran series de búsqueda para una aplicación que se ejecuta en el mismo servidor:

    1. Añada el elemento lookup a la anotación @EJB. Si se utiliza ejb-jar.xml o web.xml, se debe añadir el elemento <lookup-name> al elemento <ejb-ref>. Las modificaciones de 1a y 1b se muestran aquí:
      < span class="Code"> < span class= "JavaKeyword"> clase pública < /span> TestServlet {
      @EJB(name="ejb/MyEJB" lookup="java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface")
      MyEJB myEjb;
      ....
      }

      < span class="Code"> < ejb-ref>
      <ejb-ref-name>ejb/MyEJB</ejb-ref-name>
      <ejb-ref-type>Sesión</ejb-ref-type>
      <remote>com.test.MyEJBInterface</remote>
      <lookup-name>java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface</lookup-name>
      <ejb-ref>

    2. Declare el enlace de referencia en ibm-ejb-jar-bnd.xml o ibm-web-bnd.xml:
      < span class="Code"> < ejb-ref name="ejb/MyEJB"
      binding-name="java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface" />
      El atributo lookup, lookup-name o binding-name se puede utilizar opcionalmente para hacer referencia a los EJB en la misma aplicación. En ese caso, el valor se puede establecer en cualquier búsqueda de EJB directa aplicable que se describe al final de esta página.

A continuación se muestra la búsqueda de referencia de EJB final:

< span class="Code"> < span class= "JavaKeyword"> clase pública < /span> TestEJBClient {
public static void main(String[] args) {
....
MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:comp/env/ejb/MyEJB");
}
}

De forma alternativa, hay tres opciones para buscar un EJB directamente, sin utilizar una referencia de EJB:

  1. Cuando un bean está en el mismo módulo que su referencia:
    < span class="Code"> < span class= "JavaKeyword"> clase pública < /span> TestEJBClient {
    public static void main(String[] args) {
    ....
    MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:module/MyEJB!com.test.MyEJBInterface");
    }
    }

  2. Cuando un bean está en la misma aplicación que su referencia:
    < span class="Code"> < span class= "JavaKeyword"> clase pública < /span> TestEJBClient {
    public static void main(String[] args) {
    ....
    MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:app/moduleA/MyEJB!com.test.MyEJBInterface");
    }
    }

  3. Cuando la definición de bean se encuentra globalmente en el mismo servidor:
    < span class="Code"> < span class= "JavaKeyword"> clase pública < /span> TestEJBClient {
    public static void main(String[] args) {
    ....
    MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface");
    }
    }

Para obtener más información sobre cómo utilizar enlaces EJB, consulte Utilización de Enterprise JavaBeans con interfaces remotas en Liberty y Visión general de los enlaces de aplicación EJB 3.0 y EJB 3.1.