Unzufriedene Abhängigkeit im Frühjahr

1. Übersicht

In diesem kurzen Tutorial, werden wir Spring erklären UnsatisfiedDependencyException , was es bewirkt, und wie man sie vermeidet.

2. Ursache der UnsatisfiedDependencyException

UnsatisfiedDependencyException wird ausgelöst, wenn, wie der Name schon sagt, eine Bean- oder Eigenschaftsabhängigkeit nicht erfüllt ist.

Dies kann passieren, wenn die Spring-Anwendung versucht, eine Bean zu verkabeln, und eine der obligatorischen Abhängigkeiten nicht auflösen kann.

3. Beispielanwendung

Angenommen, wir haben eine Serviceklasse PurchaseDeptService , die von InventoryRepository abhängt :

@Service public class PurchaseDeptService { public PurchaseDeptService(InventoryRepository repository) { this.repository = repository; } }
public interface InventoryRepository { } 
@Repository public class ShoeRepository implements InventoryRepository { }
@SpringBootApplication public class SpringDependenciesExampleApplication { public static void main(String[] args) { SpringApplication.run(SpringDependenciesExampleApplication.class, args); } } 

Im Moment nehmen wir an, dass sich alle diese Klassen im selben Paket mit dem Namen com.baeldung.dependency.exception.app befinden .

Wenn wir diese Spring Boot-Anwendung ausführen, funktioniert alles einwandfrei. Mal sehen, auf welche Probleme wir stoßen können, wenn wir einen Konfigurationsschritt überspringen.

4. Komponentenanmerkung fehlt

Entfernen wir nun die Annotation @Repository aus unserer ShoeRepository- Klasse:

public class ShoeRepository implements InventoryRepository { }

Wenn wir unsere Anwendung erneut starten, wird die folgende Fehlermeldung angezeigt: UnsatisfiedDependencyException: Fehler beim Erstellen der Bean mit dem Namen 'purchaseDeptService': Unbefriedigte Abhängigkeit, ausgedrückt durch den Konstruktorparameter 0

Spring wurde nicht angewiesen, eine ShoeRepository- Bean zu verkabeln und dem Anwendungskontext hinzuzufügen, konnte sie daher nicht injizieren und löste die Ausnahme aus.

Das Hinzufügen der Annotation @Repository zurück zum ShoeRepository behebt das Problem.

5. Paket nicht gescannt

Lassen Sie uns nun unser ShoeRepository (zusammen mit InventoryRepository ) in einem separaten Paket mit dem Namen com.baeldung.dependency.exception.repository ablegen.

Wenn wir unsere App ausführen, wird erneut die UnsatisfiedDependencyException ausgelöst . Um dies zu lösen, können wir den Paket-Scan für das übergeordnete Paket konfigurieren und sicherstellen, dass alle relevanten Klassen enthalten sind:

@SpringBootApplication @ComponentScan(basePackages = {"com.baeldung.dependency.exception"}) public class SpringDependenciesExampleApplication { public static void main(String[] args) { SpringApplication.run(SpringDependenciesExampleApplication.class, args); } } 

6. Nicht eindeutige Abhängigkeitsauflösung

Angenommen, wir fügen eine weitere InventoryRepository- Implementierung hinzu - DressRepository :

@Repository public class DressRepository implements InventoryRepository { } 

Wenn wir jetzt unsere App ausführen, wird erneut die UnsatisfiedDependencyException ausgelöst.

Diesmal ist die Situation jedoch anders. Zufällig kann die Abhängigkeit nicht aufgelöst werden, wenn mehr als eine Bean sie erfüllt .

Um dies zu lösen, möchten wir möglicherweise @Qualifier hinzufügen , um zwischen den Repositorys zu unterscheiden:

@Qualifier("dresses") @Repository public class DressRepository implements InventoryRepository { } 
@Qualifier("shoes") @Repository public class ShoeRepository implements InventoryRepository { }

Außerdem müssen wir der PurchaseDeptService- Konstruktorabhängigkeit ein Qualifikationsmerkmal hinzufügen :

public PurchaseDeptService(@Qualifier("dresses") InventoryRepository repository) { this.repository = repository; }

Dadurch wird DressRepository zur einzig praktikablen Option, und Spring wird es in PurchaseDeptService einfügen .

7. Fazit

In diesem Artikel haben wir einige der häufigsten Fälle gesehen, in denen UnsatisfiedDependencyException aufgetreten ist . Außerdem haben wir gelernt, wie diese Probleme gelöst werden können.

Vielleicht möchten Sie auch das allgemeinere Tutorial zu Spring BeanCreationException lesen.

Der hier vorgestellte Code ist auf GitHub zu finden.