1

我正在学习 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!");
    }
}

引用EJB.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.MainEJB/dummyParent 的接口类型为“com.etm.ejbtest.DummyParent”的 EJB

知道为什么它不起作用吗?

4

2 回答 2

2

不要混淆 CDI 和@EJB注解;注入@EJBEJB 容器管理,而不是 CDI;它将注入一个 EJB,而不是DummyParentEJB 。

这对于刚进入现场的人来说听起来有悖常理。EJB 早在 Java EE 对 CDI 的官方支持之前就出现了。

谷歌搜索通过 CDI 注入 EJB 可能会为您提供一些启示。

于 2013-07-10T19:46:21.343 回答
1

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

 @EJB(lookup="{moduleName}/ReferencedEJB")
 private DummyParent parent;
于 2013-07-11T17:25:44.370 回答