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
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…