2013-07-10 38 views
1

我正在学习CDI和EJB。纵观CDI(http://docs.jboss.org/weld/reference/latest/en-US/html/beanscdi.html)焊缝的解释,它指出无法使用其超类注入(@EJB)ejb

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

我试图测试这个特定部分

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

所以我创建了两个EJB:延伸DummyParent ReferencedEJB和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上运行,但我得到一个错误说

EJB没有发现的接口键入'com.etm.ejbtest.DummyParent'进行绑定com.etm.ejbtest.MainEJB/dummyParent

任何想法,为什么它不工作?

回答

2

请勿混淆CDI和@EJB注释; @EJB注入由EJB容器管理,而不是CDI;它会注入一个EJB,并且​​是而不是一个EJB。

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

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

+0

是的,你是对的,当我把它改为“@注入”而不是“@EJB”它确实有效。 –

+0

或者,您可以使用'@EJB(beanInterface = ReferencedEJB.class)'或'@EJB(beanName =“ReferencedEJB”)'这样EJB容器就可以知道您想要的EJB。从EE 6/EJB 3.1开始,您还可以使用EJB(lookup =“...”)指定目标EJB的java:global,java:app或java:module JNDI名称。 –

1

您可以注入你的EJB,如果您使用以下查找参数是这样的:

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