Как настроить EJB как локальный, так и удаленный на WebSphere
-
26-09-2019 - |
Вопрос
У меня есть сессия EJB без гражданства с битным аннотациями @Local и @Remote. Код работает нормально на сервере Weblogic. Однако при развертывании его в WebSphere это дает следующее исключение.
bm.ejs.Container.ejbconfigurationException: business_interface_designated_as_both_remote_and_local: 'Oracle.odc.session.odcsession'
Класс Business интерфейса Oracle.odc.session.odcsessionsions не может быть как удаленными, так и локальными.
Доступно ли обходной путь, чтобы сделать его работать без написания отдельной EJBS для удаленного и локального вызова?
Решение
Один обходной путь состоит в том, чтобы иметь базовый интерфейс с декларациями метода, а затем иметь локальный интерфейс и удаленный интенсив, который расширяет базовый интерфейс, например,
public interface MyEJBBase {
public void foo();
public void bar();
}
@Local
public interface MyEJBLocal extends MyEJBBase {}
@Remote
public interface MyEJBRemote extends MyEJBBase {}
Другие советы
AFAIK Нет никакого способа, ошибка кажется довольно описательной.
Из раздела 4.9.7 Спецификации EJB 3.2:
Та же бизнес-интерфейс не может быть как локальным, так и удаленным бизнес-интерфейсом бона.
Вы можете использовать подинтерзасы как обходной путь:
public interface MyInterface { /* all the methods */ }
public interface MyRemoteInterface extends MyInterface { /* empty */ }
@Stateless
@Remote(MyRemoteInterface.class)
@Local(MyInterface.class)
public class MyBean { /* ... */ }
Обратите внимание, что параметры и значения возврата методов на удаленном интерфейсе будут переданы по-значению, но параметры и значения возврата методов на локальном интерфейсе будут переданы передачу.