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

时间:2012-01-27 19:18:56

标签: glassfish-3 cdi ejb-3.1

情况如下。

我有以下界面:

public interface Parent { }
public interface ChildOne extends Parent { }
public interface ChildTwo extends Parent { }

和2个EJB:

@Stateless
public class FirstBean implements ChildOne { }

@Stateless
public class SecondBean implements ChildTwo { }

还有 CDI Bean:

@Named
@SessionScoped
public class TestController implements Serializable {

    @Inject
    private FirstBean firstBean;

    @Inject
    private SecondBean secondBean;
}

尝试在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)

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

3 个答案:

答案 0 :(得分:21)

我刚刚玩了你的构造,读了一下焊缝docu并发现了以下内容。

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

@Inject
private ChildOne firstBean;

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

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

答案 1 :(得分:6)

迟到总比没有好:

使用@LocalBean添加注释SLSB对我来说适用于JBoss AS 7.1.1。我不喜欢创建没有附加值的界面的想法。

使用您的示例:

@Stateless
@LocalBean
public class FirstBean implements ChildOne { }

@Stateless
@LocalBean
public class SecondBean implements ChildTwo { }

答案 2 :(得分:0)

您是否尝试使用@EJB注释而不是CDI @inject注释?

E.g。

@Named
@SessionScoped
public class TestController implements Serializable {

    @EJB
    private FirstBean firstBean;

    @EJB
    private SecondBean secondBean;
}