无法使用超类注入(@EJB)ejb

时间:2013-07-10 19:37:53

标签: ejb cdi

我正在学习CDI和EJB。看看WELD对CDI(http://docs.jboss.org/weld/reference/latest/en-US/html/beanscdi.html)的解释,它说明了

  

会话bean的不受限制的bean类型集包含bean的所有本地接口及其超接口。如果会话bean具有bean类本地视图,则不受限制的bean类型集包含bean类和所有超类。另外,java.lang.Object是每个会话bean的bean类型。但远程接口不包含在bean类型集中。

我正在尝试测试这个特定的部分

  

不受限制的bean类型集包含bean类和所有超类

所以我创建了两个EJB:ReferencedEJB扩展了DummyParent,MainEJB扩展了EJB

DummyParent.java

package com.etm.ejbtest;

public abstract class DummyParent {
    public DummyParent() {
    }

    public void sayHi() {
        System.out.println("Hi!");
    }
}

ReferencedEJB.java

package com.etm.ejbtest;

import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;


@Singleton
@Startup
public class ReferencedEJB extends DummyParent  {
    public ReferencedEJB() {
    }

    @PostConstruct
    protected void init() {
        System.out.println("init of ReferencedEJB");
    }
}

MainEJB.java

package com.etm.ejbtest;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.Singleton;
import javax.ejb.Startup;

@Singleton
@Startup
public class MainEJB {
    @EJB
    private DummyParent dummyParent;

    public MainEJB() {
    }

    @PostConstruct
    protected void init() {
        System.out.println("init of MainEJB");
        dummyParent.sayHi();
    }
}

我在JBoss 7上运行这个,但是我收到错误说

  

没有找到带有'com.etm.ejbtest.DummyParent'类型接口的EJB来绑定com.etm.ejbtest.MainEJB / dummyParent

知道为什么它不起作用?

2 个答案:

答案 0 :(得分:2)

不要混淆CDI和@EJB注释; @EJB注入由 EJB容器管理,而不是CDI;它会注入一个EJB,而DummyParent 不是一个EJB。

对于现场的新人来说,这听起来与直觉相反。在官方Java EE支持CDI之前,EJB就已经出现了。

Google搜索通过CDI注入EJB可能会为您解释这一点。

答案 1 :(得分:1)

如果使用以下查找参数,您将能够以这种方式注入EJB:

 @EJB(lookup="{moduleName}/ReferencedEJB")
 private DummyParent parent;