【问题标题】:why is my @EJB not getting injected to my web service?为什么我的@EJB 没有被注入到我的 Web 服务中?
【发布时间】:2012-03-13 03:44:28
【问题描述】:

我在 IBM RAD(又名 Eclipse 3.4)和 WebSphere 7.0 中有一个基本的 EJB 3.0(Java EE 5)项目

我创建了一个 EAR 项目、一个 EJB 项目(用于 EJB)、一个 JPA 项目(用于域对象)和一个 Dynamic Web 项目(用于我的 JAX-RS Web 服务)。

EJB 项目包含这样的 EJB:

@Stateless
public TestBean implements TestBeanLocal { 
/* ... */

@Local
public TestBeanLocal {
/* ... */

Web 项目包含一个 JAX-RS Web 服务,如下所示:

@Path(value="/mywebservice")
public MyWebService implements Application {
  @EJB
  private TestBeanLocal myBean;

  @GET
  @Produces({"text/plain"})
  public String getList() {
    return myBean.getList();
    /* ... */

我的问题是 MyWebService 中的“myBean”属性从未注入。它始终为空。

有什么我错过的想法吗?

谢谢, 抢

【问题讨论】:

  • WebSphere 7.0 不提供开箱即用的 JAX-RS 支持。您使用什么框架(或 WebSphere 功能包)作为 JAX-RS 实现?
  • 我正在使用 Apache Wink 1.0,这是他们在 IBM RAD 帮助文档中的 JAX-RS 教程中使用的。

标签: eclipse ejb websphere jax-rs


【解决方案1】:

经过一番折腾,我创建了一个干净的新项目(下面的类名略有不同)......我注意到在 WebSphere 的启动日志中 EJB 有 JNDI 名称,所以我尝试通过它的 JNDI 来查找 EJB在 Web 服务的构造函数中...

String sJNDI = "ejblocal:testEAR/testEJB.jar/TestBean#test.TestBeanLocal";
TestBeanLocal testBeanLocal = (TestBeanLocal) new InitialContext().lookup(sJNDI);

...而且成功了。

我现在的问题是,我真的必须这样做才能看到我的豆子吗?还是我错过了什么?在另一个使用 Java EE 6 版本 GlassFish 的项目中,我所要做的就是放入 @EJB 中,这很好。这在 Java EE 5 / WebSphere 7 中根本不起作用吗?或者可能是 IBM RAD 7(又名 Eclipse 3.4)的限制?

谢谢, 抢

【讨论】:

    【解决方案2】:

    Java EE 容器只会对其管理的组件执行@EJB 注入。对于 Java EE 5,这将包括 servlet、Web 服务和 EJB。在您的情况下,组件由 Wink 管理,所以问题是 Wink 是否应该解释 @EJB(我猜不是)。使用 Java EE 6 注入是有效的,因为 JAX-RS 是该 Java EE 版本的一部分,并且组件由容器管理,而不是由第 3 方框架管理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 2013-08-30
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多