我对遗产和CDI有疑问。 给定两个接口:

  • 汽车接口
  • 扩展汽车的SportCar

      interface Car { } interface SportCar extends Car{ } class DefaultCar implements Car { } @FerrariQualifier class DefaultSportCar implements SportCar { } 

我想注入的是:

    @Inject
    private Car car; //inject DefaultCar

   @Inject 
   @FerrariQualifier
   private Car ferrari; //inject DefaultSportCar


  @Inject
  private SportCar sportCar;//inject DefaultSportCar

我怎样才能做到这一点?

===============>>#1 票数:3

在没有任何其他示例或解释的情况下,您需要使用限定符@Default注入第一个。

显然,这进一步需要在“汽车”上附加一个非@Default限定词,否则您的解析度就模棱两可,并且您试图将不合适的内容插入CDI。

===============>>#2 票数:1

我认为您误解了CDI注入。 特别是您要执行此操作:

@Inject
private Car car; //inject DefaultCar

因为任何一种汽车实施方案(跑车或普通汽车)都将适用于此,您最终将获得含糊不清的分辨率。

作为临时解决方案,您可以使用用户盟友指出的@Default限定符,但是一旦引入其他任何没有限定符的汽车实现方案,这势必会中断。

最干净的解决方案可能是重新考虑设计并更改层次结构,如下所示:

interface Car {
  // all cars, place common methods here
 }

interface SportCar extends Car{
  // interface for all sport cars
}

interface ClassicCar extends Car{
  // interface for all non-sport cars
  // this is what you will inject
}

class DefaultCar implements ClassicCar {

}

@FerrariQualifier
class DefaultSportCar implements SportCar {

}

这样,您就可以:

@Inject
private ClassicCar car;

并获取DefaultCar的实例。 其余注射将以相同方式工作。

另一种解决方案是使用限定符。

一般来说,每当遇到歧义的解析时,就有多个可以注入的bean,您需要使用限定符或注入更具体的接口/类来缩小选择范围。

  ask by Otávio Santana translate from so

未解决问题?本站智能推荐: