Unzufriedenheit im Frühling

Unzufriedene Abhängigkeit im Frühjahr

1. Überblick

In diesem kurzen Tutorial erklären wir Spring'sUnsatisfiedDependencyException, was es verursacht und wie man es vermeidet.

2. Ursache vonUnsatisfiedDependencyException

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 verbinden, und eine der obligatorischen Abhängigkeiten nicht auflösen kann.

3. Beispielanwendung

Angenommen, wir haben eine ServiceklassePurchaseDeptService, die vonInventoryRepository: 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 gehen wir davon aus, dass sich alle diese Klassen im selben Paket mit dem Namencom.example.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@Repository -Sannotation aus unsererShoeRepository-Klasse:

public class ShoeRepository implements InventoryRepository {
}

Wenn wir unsere Anwendung erneut starten, wird die folgende Fehlermeldung angezeigt:UnsatisfiedDependencyException: Error creating bean with name ‘purchaseDeptService': Unsatisfied dependency expressed through constructor parameter 0

Spring wurde nicht angewiesen, eineShoeRepository-Bohne zu verdrahten und zum Anwendungskontext hinzuzufügen. Daher konnte sie nicht injiziert werden und löste die Ausnahme aus.

Das Hinzufügen der Annotation@Repository zuShoeRepository löst das Problem.

5. Paket nicht gescannt

Fügen wir nun unsereShoeRepository (zusammen mitInventoryRepository) in ein separates Paket mit dem Namencom.example.dependency.exception.repository. ein

Wenn wir unsere App ausführen, werden erneut dieUnsatisfiedDependencyException ausgegeben. Um dies zu lösen, können wir den Paketscan für das übergeordnete Paket konfigurieren und sicherstellen, dass alle relevanten Klassen enthalten sind:

@SpringBootApplication
@ComponentScan(basePackages = {"com.example.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 Implementierung vonInventoryRepositoryhinzu -DressRepository:

@Repository
public class DressRepository implements InventoryRepository {
}

Wenn wir jetzt unsere App ausführen, werden dieUnsatisfiedDependencyException. erneut ausgelöst

Diesmal ist die Situation jedoch anders. Zufällig sind diedependency cannot be resolved when there’s more than one bean that satisfies it.

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 Konstruktorabhängigkeit vonPurchaseDeptServiceein Qualifikationsmerkmal hinzufügen:

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

Dies machtDressRepository zur einzig praktikablen Option, und Spring injiziert es inPurchaseDeptService.

7. Fazit

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

Vielleicht möchten Sie sich auch das allgemeinere Tutorial zuSpring BeanCreationException ansehen.

Der hier dargestellte Code istover on GitHub.