Как мне вызвать удаленный EJB в EAR от другого? - PullRequest
6 голосов
/ 02 марта 2010

В Weblogic 10.3 как мне внедрить удаленный EJB из одного EAR в bean-компонент без состояния другого, причем оба EAR развернуты в одном контейнере? В идеале я хотел бы сделать как можно больше с аннотациями.

Итак, предположим, у меня есть следующий интерфейс:

public interface HelloService {
  public String hello();
}

реализовано следующим EJB:

@Stateless
@Remote
public class HelloServiceBean implements HelloService {
  public String hello() {
      return "hello";
  }
}

Предположим, они упакованы и развернуты в server.ear. Теперь в client.ear у меня есть следующее:

@Stateless
public class HelloClientBean {
    @EJB
    HelloService helloService;

// other methods...
}

Что мне нужно добавить, чтобы Weblogic правильно вычислил проводку между HelloClientBean в client.ear и HelloServiceBean в server.ear? Указатели на официальную документацию и / или книги горячо приветствуются.

1 Ответ

4 голосов
/ 03 марта 2010

Самое простое решение, которое я нашел на данный момент, заключается в следующем.

Сначала аннотируйте bean-компонент без сохранения состояния с атрибутом mappedName:

@Stateless(mappedName="HelloService")
@Remote
public class HelloServiceBean implements HelloService {
  public String hello() {
      return "hello";
  }
}

Согласно http://forums.oracle.com/forums/thread.jspa?threadID=800314&tstart=1, Weblogic никогда не создаст запись JNDI для EJB, если имя JNDI не задано в качестве атрибута mappedName (или в дескрипторе развертывания, или в проприетарной аннотации).

Далее вы можете аннотироватьваше клиентское поле с @EJB с атрибутом mappedName, которое должно быть таким же, как атрибут на bean-сервере .(Я искренне удивлен этим. NameNotFoundException при вызове EJB в Weblogic 10.3 предполагает, что я должен иметь возможность использовать синтаксис mappedName#interfaceName, но в моих тестах это не работает.):

@Stateless
public class HelloClientBean {
    @EJB(mappedName="HelloService")
    HelloService helloService;

// other methods...
}

Теперь это работает, если оба EAR развернуты в одном и том же контейнере.Далее я попытаюсь выяснить правильный синтаксис, когда они развернуты на разных машинах.

...