Ich denke, Sie haben die CDI-Injektion ein wenig missverstanden. Vor allem, dass Sie dies tun wollen:
@Inject
private Car car; //inject DefaultCar
Da jede Auto-Implementierung (Sportwagen oder gewöhnliche) passt hier und Sie werden mit mehrdeutigen Auflösung enden.
Als temporäre Lösung, können Sie die Verwendung des @Default
Qualifier machen als vom User covener bemerkt aber dies ist verpflichtet, so schnell zu brechen, wie Sie ohne Qualifier andere Auto Implementierung einzuführen.
Die sauberste Lösung ist vielleicht neu denken das Design und die Änderung der Hierarchie wie folgt aus:
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 {
}
Mit diesem können Sie dann:
@Inject
private ClassicCar car;
Und eine Instanz von DefaultCar
bekommen. Der Rest Ihrer Injektionen funktioniert genauso.
Die andere Lösung besteht darin, Qualifier zu verwenden.
Im Allgemeinen - wann immer Sie auf mehrdeutige Auflösung stoßen, haben Sie mehr als eine Bean für die Injektion und Sie müssen die Auswahl einschränken, indem Sie entweder Qualifier verwenden oder eine spezifischere Schnittstelle/Klasse einfügen.
Es wäre hilfreich, die mehrdeutige Auflösungsausnahme zu zeigen, die Sie mit dem aktuellen Code erhalten, vorausgesetzt, das ist Ihr Problem. – covener