如何在另一个EAR中调用远程EJB?

时间:2010-03-01 21:12:01

标签: java-ee ejb-3.0 weblogic ejb

在Weblogic 10.3中,如何将远程EJB从一个EAR注入到另一个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.earHelloServiceBean中的server.ear之间正确计算出布线?热烈欢迎官方文件和/或书籍的指示。

1 个答案:

答案 0 :(得分:4)

到目前为止,我发现的最简单的解决方案如下:

首先,使用mappedName属性注释无状态bean:

@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,除非将JNDI名称作为mappedName属性(或部署描述符或专有注释)给出,否则Weblogic永远不会为EJB创建JNDI条目。 / p>

接下来,您现在可以使用@EJB使用mappedName属性注释客户端字段,该属性应与服务器bean上的属性相同。 (老实说,我对此感到困惑。NameNotFoundException when calling a EJB in Weblogic 10.3表示我应该能够使用mappedName#interfaceName语法,但在我的测试中这不起作用。):

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

// other methods...
}

只要两个EAR都部署在同一个容器中,现在就可以了。接下来,当它们部署在不同的机器上时,我会尝试找出正确的语法。