Расположения пользовательских привязок EJB ранее игнорировались в Liberty

В версиях Liberty ниже 20.0.0.12 объекты EJB связывались только с пространством имен java:[scope]. Объекты EJB не связывались с корневым пространством имен JNDI сервера, то есть нельзя создавать имена привязок JNDI. Атрибуты привязок EJB, позволяющие указать имя JNDI в WebSphere Application Server traditional, игнорировались в Liberty.

Следующие атрибуты привязок EJB из файла ibm-ejb-jar-bnd.xml игнорировались в Liberty.

Следующие атрибуты привязок EJB из файла ibm-ejb-jar-bnd.xmi игнорировались в Liberty.

Это правило помечает имена привязок JNDI, которые игнорировались в версиях Liberty ниже 20.0.0.12. Если приложение использует эти имена в операциях прямого поиска JNDI, а не через ссылки EJB, то следует использовать Liberty версии 20.0.0.12 и выше или приложение необходимо переработать.

Если используются ссылки EJB, то правило Изменение логики поиска объектов EJB в предыдущих версиях Liberty помечает все имена JNDI, которые должны быть преобразованы в пространство имен java: в случае применения Liberty версии ниже 20.0.0.12.

Если ссылки EJB не используются и применяется версия Liberty ниже 20.0.0.12, рекомендуется перейти на более новую версию Liberty или создать ссылку EJB с тем же именем JNDI и указать в его свойстве binding-name имя JNDI java:[scope]. Если ссылку EJB не добавить, то потребуется проверка кода Java на наличие таких имен JNDI и преобразование имени для поиска в имя JNDI java:.


Пример миграции EJB:

Следующий пример создает ссылку на EJB, помогающую выполнить миграцию ошибок поиска, если не применяется Liberty версии 20.0.0.12 и выше.

EJB, на который указывает ссылка:

@Stateless
public class MyEJB implements MyEJBInterface {
public String sayHello(String name) {
return "Привет" + name + ".";
}
}

Удаленный интерфейс:

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

Примеры ссылок на EJB:

В следующих примерах показано, как объявить ссылку на EJB в Liberty. Для связывания EJB и ссылки вместе с 2a, 2b, 3a или 3b требуется 1a или 1b. Например, для простой настройки рекомендуется использовать варианты 1a и 2b, однако аналогичные функции можно получить в результате объявления 1b вместе с 3b.

  1. Ссылка объявляется с помощью аннотации в классе, содержащем ссылку на EJB (ejb-jar.xml или web.xml).
    1. Аннотация EJB:
      < span class="Code"> < span class= "JavaKeyword"> public class < /span> < span class="JavaType">TestServlet< /span> {
      @EJB(name="ejb/MyEJB")
      MyEJB myEjb;
      ....
      }

    2. ejb-jar.xml и web.xml:
      < span class="Code"> < 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.xml или ibm-web-bnd.xml не требуется. Одно из следующих действий позволяет контейнеру EJB автоматически связать EJB и ссылку, если они входят в состав одного приложения:

    1. Если только один объект EJB реализует удаленный интерфейс EJB, то дополнительная настройка не требуется.

    2. Если несколько объектов EJB в приложении реализуют удаленный интерфейс EJB, то в аннотацию @EJB необходимо добавить элемент beanName. В случае применения файла ejb-jar.xml или web.xml элемент <ejb-link> необходимо добавить в существующий элемент <ejb-ref>. Здесь показаны изменения 1a и 1b:
      < span class="Code"> < span class= "JavaKeyword"> public class < /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>Сеанс</ejb-ref-type>
      <remote>com.test.MyEJBInterface</remote>
      <ejb-link>MyEJB</ejb-link>
      < ejb-ref>

  3. Если объект EJB и ссылка находятся в разных приложениях, то для добавления строки поиска необходимо выполнить одно из следующих действий. В следующих примерах показаны строки поиска для приложения, работающего на том же сервере:

    1. Добавьте элемент lookup в аннотацию @EJB. В случае применения файла ejb-jar.xml или web.xml элемент <lookup-name> необходимо добавить в существующий элемент <ejb-ref>. Здесь показаны изменения 1a и 1b:
      < span class="Code"> < span class= "JavaKeyword"> public class < /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>Сеанс</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.xml или ibm-web-bnd.xml:
      < span class="Code"> < ejb-ref name="ejb/MyEJB"
      binding-name="java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface" />
      При необходимости для создания ссылок на объекты EJB в том же приложении можно использовать атрибут lookup, lookup-name или binding-name. В этом случае можно указать любой применимый прямой поиск EJB (см. описание в конце страницы).

Окончательная реализация поиска ссылки на EJB:

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

Кроме того, предусмотрены три варианта поиска EJB напрямую без использования ссылки на EJB:

  1. Если объект EJB и ссылка принадлежат одному модулю:
    < span class="Code"> < span class= "JavaKeyword"> public class < /span> TestEJBClient {
    public static void main(String[] args) {
    ....
    MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:module/MyEJB!com.test.MyEJBInterface");
    }
    }

  2. Если объект EJB и ссылка принадлежат одному приложению:
    < span class="Code"> < span class= "JavaKeyword"> public class < /span> TestEJBClient {
    public static void main(String[] args) {
    ....
    MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:app/moduleA/MyEJB!com.test.MyEJBInterface");
    }
    }

  3. Если требуется глобальный поиск определения объекта EJB на том же сервере:
    < span class="Code"> < span class= "JavaKeyword"> public class < /span> TestEJBClient {
    public static void main(String[] args) {
    ....
    MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface");
    }
    }

Дополнительная информация о применении привязок EJB приведена в разделах Использование EJB с удаленными интерфейсами в Liberty и Обзор привязок приложений EJB 3.0 и EJB 3.1.