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.