为什么我的@EJB没有注入我的网络服务?

时间:2012-02-22 18:54:33

标签: eclipse ejb websphere jax-rs

我在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”属性从未注入。它总是空的。

我错过了什么想法?

谢谢, 罗布

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

经过多次拉动之后,我创建了一个干净的新项目(下面的类名略有不同)...我注意到在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)的限制?

谢谢, 罗布