Nespokojná závislosť na jar

1. Prehľad

V tomto rýchlom návode si vysvetlíme jarné UnsatisfiedDependencyException, čo to spôsobuje a ako sa tomu vyhnúť.

2. Príčina UnsatisfiedDependencyException

UnsatisfiedDependencyException vyhodí sa, keď, ako už názov napovedá, nie je splnená určitá závislosť od fazule alebo vlastnosti.

Toto sa môže stať, keď sa jarná aplikácia pokúsi spojiť fazuľu a nemôže vyriešiť jednu z povinných závislostí.

3. Ukážka aplikácie

Predpokladajme, že máme triedu služieb PurchaseDeptService, od ktorého závisí Úložisko zásob:

@Service verejná trieda PurchaseDeptService {public PurchaseDeptService (úložisko InventoryRepository) {this.repository = úložisko; }}
verejné rozhranie InventoryRepository {} 
@Repository verejná trieda ShoeRepository implementuje InventoryRepository {}
@SpringBootApplication verejná trieda SpringDependenciesExampleApplication {public static void main (String [] args) {SpringApplication.run (SpringDependenciesExampleApplication.class, args); }} 

Zatiaľ budeme predpokladať, že všetky tieto triedy sú umiestnené v rovnakom balíku s názvom com.baeldung.dependency.exception.app.

Keď spustíme túto aplikáciu Spring Boot, všetko funguje dobre. Pozrime sa, na aké problémy môžeme naraziť, ak preskočíme krok konfigurácie.

4. Chýba anotácia súčasti

Teraz poďme odstrániť @Úložisko anotácia z našej Úložisko obuvi trieda:

verejná trieda ShoeRepository implementuje InventoryRepository {}

Keď aplikáciu znova spustíme, zobrazí sa nasledujúce chybové hlásenie: UnsatisfiedDependencyException: Chyba pri vytváraní fazule s názvom ‘purchaseDeptService‘: Neuspokojená závislosť vyjadrená parametrom konštruktora 0

Spring nedostal pokyn, aby drôtoval Úložisko obuvi bean a pridať ho do kontextu aplikácie, preto ho nemohol vložiť a vyhodil výnimku.

Pridáva sa @Úložisko anotácia späť na Úložisko obuvi rieši problém.

5. Balík nebol naskenovaný

Poďme teraz dať Úložisko obuvi (spolu s InventoryRepository) do samostatného balíka s názvom com.baeldung.dependency.exception.repository.

Opäť, keď spustíme našu aplikáciu, hodí sa to UnsatisfiedDependencyException . Aby sme to vyriešili, môžeme nakonfigurovať skenovanie balíkov na nadradenom balíku a zabezpečiť, aby boli zahrnuté všetky príslušné triedy:

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

6. Nejedinečné riešenie závislostí

Predpokladajme, že pridáme ďalší InventoryRepository implementácia - DressRepository:

@Repository verejná trieda DressRepository implementuje InventoryRepository {} 

Teraz, keď spustíme našu aplikáciu, bude to opäť vyhodiť UnsatisfiedDependencyException.

Tentokrát je však situácia iná. Ako sa to stane, závislosť sa nedá vyriešiť, keď existuje viac ako jedna fazuľa, ktorá ju uspokojuje.

Aby sme to vyriešili, možno budeme chcieť pridať @Qualifier rozlišovať medzi archívmi:

@Qualifier ("dress") @Repository verejná trieda DressRepository implementuje InventoryRepository {} 
@Qualifier ("shoes") @Repository verejná trieda ShoeRepository implementuje InventoryRepository {}

Tiež budeme musieť pridať kvalifikátor do PurchaseDeptService závislosť konštruktora:

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

Toto bude robiť DressRepository jediná životaschopná možnosť a Spring ju do nej vloží PurchaseDeptService.

7. Záver

V tomto článku sme videli niekoľko najbežnejších prípadov stretnutia UnsatisfiedDependencyException. Tiež sme sa naučili, ako tieto problémy vyriešiť.

Môžete sa tiež pozrieť na všeobecnejší návod o jarnej BeanCreationException.

Tu uvedený kód nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found