Elégedetlen függőség tavasszal

1. Áttekintés

Ebben a gyors bemutatóban elmagyarázzuk a tavaszit UnsatisfiedDependencyException, mi okozza, és hogyan lehet elkerülni.

2. Oka UnsatisfiedDependencyException

UnsatisfiedDependencyException akkor dobják meg, amikor a neve is mutatja, hogy bizonyos bab- vagy vagyonfüggőség nem teljesül.

Ez akkor fordulhat elő, amikor a tavaszi alkalmazás megpróbálja bekötni a babot, és nem tudja megoldani az egyik kötelező függőséget.

3. Példa alkalmazásra

Tegyük fel, hogy van egy szolgáltatási osztályunk PurchaseDeptService, ami attól függ InventoryRepository:

@Service public class PurchaseDeptService {public PurchaseDeptService (InventoryRepository repository) {this.repository = repository; }}
nyilvános felület InventoryRepository {} 
A @Repository nyilvános osztályú ShoeRepository megvalósítja az InventoryRepository {}
@SpringBootApplication public class SpringDependenciesExampleApplication {public static void main (String [] args) {SpringApplication.run (SpringDependenciesExampleApplication.class, args); }} 

Egyelőre azt feltételezzük, hogy ezek az osztályok ugyanabban a csomagban találhatók com.baeldung.dependency.exception.app.

A Spring Boot alkalmazás futtatásakor minden rendben működik. Nézzük meg, milyen problémákba ütközhetünk, ha kihagyunk egy konfigurációs lépést.

4. Hiányzik az alkatrész kommentárja

Most távolítsuk el a @Raktár annotáció a mi Cipőtár osztály:

public class ShoeRepository megvalósítja az InventoryRepository {}

Amikor újraindítjuk az alkalmazásunkat, a következő hibaüzenetet látjuk: UnsatisfiedDependencyException: Hiba a „BuyDeptService” névvel rendelkező bab létrehozásakor: A 0 konstruktor paraméteren keresztül kifejezett elégedetlen függőség

Tavaszt nem utasították a Cipőtár babot, és adja hozzá az alkalmazás kontextusához, ezért nem tudta beadni, és dobta a kivételt.

A @Raktár annotáció vissza a Cipőtár megoldja a kérdést.

5. A csomag nincs beolvasva

Most tegyük a mi Cipőtár (együtt InventoryRepository) külön nevű csomagba com.baeldung.dependency.exception.repository.

Még egyszer, amikor futtatjuk az alkalmazásunkat, ez dobja a UnsatisfiedDependencyException . Ennek megoldására konfigurálhatjuk a csomagellenőrzést a szülőcsomagon, és ellenőrizhetjük, hogy az összes releváns osztály szerepel-e benne:

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

6. Nem egyedi függőségmegoldás

Tegyük fel, hogy adunk hozzá még egyet InventoryRepository megvalósítás - DressRepository:

@Repository public class DressRepository megvalósítja az InventoryRepository {} 

Most, amikor futtatjuk az alkalmazásunkat, az újra dobja a UnsatisfiedDependencyException.

Ezúttal azonban más a helyzet. Ahogy történik, a a függőség nem oldható fel, ha egynél több bab elégíti ki.

Ennek megoldásához érdemes hozzáfűznünk @ Minősítő megkülönböztetni az adattárakat:

@Qualifier ("dresses") @Repository nyilvános osztályú DressRepository megvalósítja az InventoryRepository {} 
@Qualifier ("shoes") @Repository public class ShoeRepository megvalósítja az InventoryRepository {}

Ezenkívül hozzá kell adnunk egy minősítőt is PurchaseDeptService kivitelező függőség:

public PurchaseDeptService (@Qualifier ("ruhák") InventoryRepository repository) {this.repository = repository; }

Ez meg fogja tenni DressRepository az egyetlen életképes lehetőség, és Spring beadja PurchaseDeptService.

7. Következtetés

Ebben a cikkben számos leggyakoribb esetet láthattunk UnsatisfiedDependencyException. Megtanultuk ezeket a problémákat is.

Érdemes megnéznie a Spring BeanCreationException általánosabb bemutatóját is.

Az itt bemutatott kód megtalálható a GitHub oldalon.


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