CDI Ambiguous dependency with @Produces - why?

前端 未结 3 1731
自闭症患者
自闭症患者 2020-12-06 11:13

I am using code like below:

public Configuration {

    private boolean isBatmanCar = someMethod(...);

    @Produces
    public Car getCar(@New Car car) {
          


        
3条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-06 11:35

    The error comes from the fact that you have 2 beans of type Car, one being the class, the other being the producer. You have 2 obvious solutions to resolve the ambiguity:

    First, you put the logic behind isBatmanCar field in the original class (in a constructor or a @PostConstruct method for instance) and remove your producer. That would left only one Car bean.

    Or if you really want to have 2 bean or can't avoid it you should create a qualifier for your produced bean:

     @Target({ TYPE, METHOD, PARAMETER, FIELD })
     @Retention(RUNTIME)
     @Documented
     @Qualifier
     public @interface BatmanChecked {
     }
    

    and use it on producer,

    @Produces
    @BatmanChecked
    public Car getCar(Car car) {...}
    

    to be able to inject the type of car

    @Inject
    Car stdCar;
    
    @Inject
    @BatmanChecked
    Car batCheckedCar;
    

    Qualifier is the natural option to resolve ambiguous injection. Using @Alternative also works but it's more a trick here than a good practice.

    Last remark: @New is not necessary here, since your Car bean has no scope (so is @Dependent scoped). @New is only useful when a producer inject a bean with a scope that is not @Dependent. That said, this code is not very useful if your Car class is in scope @Dependent.

提交回复
热议问题