В версиях 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-namesession component-idsession local-home-binding-namesession remote-home-binding-nameinterface binding-nameСледующие атрибуты привязок EJB из файла ibm-ejb-jar-bnd.xmi игнорировались в Liberty.
ejbBindings jndiNameЭто правило помечает имена привязок 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, помогающую выполнить миграцию ошибок поиска, если не применяется Liberty версии 20.0.0.12 и выше.
EJB, на который указывает ссылка:
|
@Stateless public class MyEJB implements MyEJBInterface { public String sayHello(String name) { return "Hello there " + name + "."; } } |
Удаленный интерфейс:
|
@Remote public interface MyEJBInterface { String sayHello(String name); } |
В следующих примерах показано, как объявить ссылку на EJB в Liberty. Для связывания EJB и ссылки вместе с 2a, 2b, 3a или 3b требуется 1a или 1b. Например, для простой настройки рекомендуется использовать варианты 1a и 2b, однако аналогичные функции можно получить в результате объявления 1b вместе с 3b.
|
public class TestServlet { @EJB(name="ejb/MyEJB") MyEJB myEjb; .... } |
|
<ejb-ref> <ejb-ref-name>ejb/MyEJB</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <remote>com.test.MyEJBInterface</remote> <ejb-ref> |
@EJB необходимо добавить элемент beanName. В случае применения файла 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>Session</ejb-ref-type> <remote>com.test.MyEJBInterface</remote> <ejb-link>MyEJB</ejb-link> <ejb-ref> |
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>Session</ejb-ref-type> <remote>com.test.MyEJBInterface</remote> <lookup-name>java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface</lookup-name> <ejb-ref> |
|
<ejb-ref name="ejb/MyEJB" binding-name="java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface"/> |
lookup, lookup-name
или binding-name. В этом случае можно указать любой применимый прямой
поиск EJB (см. описание в конце страницы).
Окончательная реализация поиска ссылки на EJB:
|
public class TestEJBClient { public static void main(String[] args) { .... MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:comp/env/ejb/MyEJB"); } } |
Кроме того, предусмотрены три варианта поиска EJB напрямую без использования ссылки на EJB:
|
public class TestEJBClient { public static void main(String[] args) { .... MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:module/MyEJB!com.test.MyEJBInterface"); } } |
|
public class TestEJBClient { public static void main(String[] args) { .... MyEJBInterface myEjbInterface = (MyEJBInterface) context.lookup("java:app/moduleA/MyEJB!com.test.MyEJBInterface"); } } |
|
public class 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.