WELD-001408注入实现接口的EJB时不满意的依赖关系

jFr*_*tic 14 cdi ejb-3.1 glassfish-3

情况就是这样.

我有以下接口:

public interface Parent { }
public interface ChildOne extends Parent { }
public interface ChildTwo extends Parent { }
Run Code Online (Sandbox Code Playgroud)

和2个EJB:

@Stateless
public class FirstBean implements ChildOne { }

@Stateless
public class SecondBean implements ChildTwo { }
Run Code Online (Sandbox Code Playgroud)

还有这个CDI Bean:

@Named
@SessionScoped
public class TestController implements Serializable {

    @Inject
    private FirstBean firstBean;

    @Inject
    private SecondBean secondBean;
}
Run Code Online (Sandbox Code Playgroud)

在尝试在Glassfish 3.1上部署它时,我得到以下异常:

Exception while loading the app : WELD-001408 Unsatisfied dependencies for type [FirstBean]
with qualifiers [@Default] at injection point [[field] @Inject private com.test.controllers.TestController.firstBean]
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [FirstBean] 
with qualifiers [@Default] at injection point [[field] @Inject private com.test.controllers.TestController.firstBean]
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:305)
Run Code Online (Sandbox Code Playgroud)

当两个EJB都实现Parent接口时,异常是相同的.
此外,我尝试添加限定符,但这并没有改变任何东西.

Rol*_*ner 22

我刚刚玩了你的构造,阅读了一些焊接文档,并发现了以下内容.

您正在使用实现接口的EJB,因此无法再显示无接口视图(显然),但您正在尝试直接访问实现.一旦将其声明为EJB,就必须牢记约定.因此,如果您定义了一个接口,则必须使用它来访问EJB.将其更改为以下内容,应该可以解决:

@Inject
private ChildOne firstBean;
Run Code Online (Sandbox Code Playgroud)

即使定义了接口,访问实现也只适用于普通的CDI Managed Beans(没有@Stateless/@ Stateful注释的类).所以摆脱你的注释,它会成功.

仅供参考,如果您使用的是Glassfish.如果您坚持使用EJB并尝试访问父接口方法,则会遇到错误/异常.


ata*_*man 7

迟到总比不到好:

@LocalBean使用JBoss AS 7.1.1为我的工作添加了SLSB .我不喜欢创建没有附加值的接口的想法.

使用你的例子:

@Stateless
@LocalBean
public class FirstBean implements ChildOne { }

@Stateless
@LocalBean
public class SecondBean implements ChildTwo { }
Run Code Online (Sandbox Code Playgroud)