【问题标题】:How do I call a remote EJB in an EAR from another?如何从另一个 EAR 调用远程 EJB?
【发布时间】:2010-03-01 21:12:01
【问题描述】:

在 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 正确计算出client.ear 中的HelloClientBeanserver.ear 中的HelloServiceBean 之间的连接?热烈欢迎指向官方文档和/或书籍的指针。

【问题讨论】:

  • 无耻的颠簸。到目前为止,我所知道的是,Weblogic 会将使用 @Stateless(mappedName="foo") 注释的无状态 bean 绑定到 JNDI 中的“foo#fully.qualified.interface.name”。但是我应该如何在HelloClientBean 中注释我的helloService 字段?

标签: jakarta-ee ejb-3.0 weblogic ejb


【解决方案1】:

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

首先,使用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,Weblogic 永远不会为 EJB 创建 JNDI 条目,除非 JNDI 名称作为 mappedName 属性(或在部署描述符中,或在专有注释中)给出。

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

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

// other methods...
}

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

【讨论】:

  • 使用命名很有帮助,而且工作正常,但不适合自定义。任何配置更改都会影响您的代码。 EJB jar xml 配置或在启动时通过 CDI 进行一些配置注入/代理会做同样的事情,但也使您能够对其进行参数化,从而提高维护和部署能力。
  • 使用映射名称的 EJB 可能不可移植。
  • 很有可能在一个专有容器中开发的应用程序永远不会移植到另一个品牌(因为它们倾向于利用这些容器的扩展)。这是旧的两难境地,可移植性是某些类别的系统的要求,并且不为别人。
猜你喜欢
  • 2023-03-22
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多