EJB接口依赖注入

4

我有一个接口 I,它有一个方法 m,并且有两个具体实现 AB

public interface I{
   public void m();
}
public class A implements I{
  public void m(){
    //
   }
}
public class B implements I{
    public void m(){
     //
    }
}

我想知道在我注入代码 I 时,哪种方法将被执行。

@EJB
private I service;
///
service.m();
/////
2个回答

1

没有提供实现类的id,应用服务器不知道该使用哪个实现类,会导致错误。为避免此情况,只需提供类实现的id,该id默认与类名相同,但以小写字母开头:

//uncomment one of these
//@EJB(name="a")
//@EJB(name="b")
private I service;

如果在代码中使用A或B实现的条件,我必须声明两者,这是否可能? - ps0604
如果是这种情况,I service 应该不是一个属性,而是您方法中的局部变量。使用 JNDI 查找,像这样:I service = (I) InitialContext.lookup("java:module/A"); - Luiggi Mendoza

0

都不行。代码可以编译,但是你无法在应用服务器上部署它。如果没有指定注入类的类型,你将会得到一个类似于这样的异常:

org.jboss.weld.exceptions.DeploymentException:WELD-001409 Ambiguous dependencies
for type [...] with qualifiers [...] at injection point [...]. Possible dependencies
[...] with qualifiers [...], Managed Bean [...] with qualifiers [...]

容器(即您的应用服务器)无法识别您真正想要注入的字段(A还是B)。它不能仅仅凭空猜测。为避免这种错误,请提供注释(称为限定符),指定您想要注入的是A类还是B类。如果您需要一个示例,可以查看本文


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接