Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用其超类注入(@EJB)EJB_Ejb_Cdi - Fatal编程技术网

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

无法使用其超类注入(@EJB)EJB,ejb,cdi,Ejb,Cdi,我正在学习CDI和EJB。查看WELD对CDI()的解释,它指出 会话bean的无限制bean类型集包含bean的所有本地接口及其超级接口。如果会话bean有一个bean类本地视图,则不受限制的bean类型集包含bean类和所有超类。此外,java.lang.Object是每个会话bean的bean类型。但是远程接口不包括在bean类型集中 我正在尝试测试这个特殊的部分 无限制的bean类型集包含bean类和所有超类 因此,我创建了两个EJB:ReferenceEJB(扩展DummyParent

我正在学习CDI和EJB。查看WELD对CDI()的解释,它指出

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

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

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

因此,我创建了两个EJB:ReferenceEJB(扩展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();
    }
}
我在JBoss7上运行这个,但是我得到一个错误

未找到绑定com.etm.ejbtest.MainEJB/DummyParent的接口类型为“com.etm.ejbtest.DummyParent”的EJB


知道它为什么不工作吗?

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

这听起来与现场新手的直觉背道而驰。ejb出现在对CDI的正式javaee支持之前


谷歌搜索通过CDI注入EJB可能会对此有所帮助。

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

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

是的,您是对的,当我将其更改为“@Inject”而不是“@EJB”时,它确实可以工作。或者,您可以使用
@EJB(beanInterface=ReferencedEJB.class)
@EJB(beanName=“ReferencedEJB”)
,以便EJB容器知道您想要哪个EJB。从EE 6/EJB3.1开始,您还可以使用
EJB(lookup=“…”)
指定目标EJB的java:global、java:app或java:module JNDI名称。