情况如下。
我有以下界面:
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
接口时,异常是相同的
此外,我尝试添加限定符,但这并没有改变任何内容。
答案 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;
}