В версиях 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.
session simple-binding-name
session component-id
session local-home-binding-name
session remote-home-binding-name
interface binding-name
Следующие атрибуты привязок 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.
- Ссылка объявляется с помощью аннотации в классе, содержащем ссылку на EJB
(ejb-jar.xml или web.xml).
- Аннотация EJB:
< span class="Code"> < span class= "JavaKeyword"> public class < /span> < span class="JavaType">TestServlet< /span> {
@EJB(name="ejb/MyEJB")
MyEJB myEjb;
....
}
- 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>
- Если EJB и ссылка принадлежат одному приложению, то
запись в файле ibm-ejb-jar-bnd.xml или
ibm-web-bnd.xml не требуется. Одно из следующих действий позволяет
контейнеру EJB автоматически связать EJB и ссылку, если они входят в состав одного
приложения:
- Если только один объект EJB реализует удаленный интерфейс EJB, то дополнительная настройка не требуется.
- Если несколько объектов 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>
- Если объект EJB и ссылка находятся в разных приложениях, то для добавления строки
поиска необходимо выполнить одно из следующих действий.
В следующих примерах показаны строки поиска для приложения, работающего на том же
сервере:
- Добавьте элемент
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>
- Объявите привязку ссылки в файле 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:
- Если объект 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");
}
}
- Если объект 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");
}
}
- Если требуется глобальный поиск определения объекта 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.