无法使用其超类注入(@EJB)EJB
我正在学习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无法使用其超类注入(@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
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名称。