Nezadovoljna ovisnost u proljeće

1. Pregled

U ovom brzom vodiču objasnit ćemo proljeće NezadovoljnoDependencyException, što uzrokuje i kako to izbjeći.

2. Uzrok NezadovoljnoDependencyException

NezadovoljnoDependencyException se baci kad, kao što mu samo ime govori, ovisi neka grah ili ovisnost o svojstvu.

To se može dogoditi kada aplikacija Spring pokušava povezati grah i ne može riješiti jednu od obaveznih ovisnosti.

3. Primjer prijave

Pretpostavimo da imamo klasu usluge PurchaseDeptService, što ovisi o Spremište zaliha:

@Service javna klasa PurchaseDeptService {public PurchaseDeptService (spremište InventoryRepository) {this.repository = spremište; }}
javno sučelje InventoryRepository {} 
@Repository javna klasa ShoeRepository implementira InventoryRepository {}
@SpringBootApplication javna klasa SpringDependenciesExampleApplication {javna statička void glavna (String [] args) {SpringApplication.run (SpringDependenciesExampleApplication.class, args); }} 

Za sada ćemo pretpostaviti da su sve ove klase smještene u istom imenovanom paketu com.baeldung.dependency.exception.app.

Kada pokrenemo ovu aplikaciju Spring Boot, sve funkcionira u redu. Pogledajmo na kakve probleme možemo naići ako preskočimo korak konfiguracije.

4. Nedostaje napomena o komponenti

Uklonimo sada @ Repozitorij napomena iz našeg Repozitorij cipela razred:

javna klasa ShoeRepository implementira InventoryRepository {}

Kad ponovo pokrenemo našu aplikaciju, vidjet ćemo sljedeću poruku o pogrešci: UnsatisfiedDependencyException: Pogreška pri stvaranju graha s imenom 'purchaseDeptService': Nezadovoljna ovisnost izražena kroz parametar konstruktora 0

Springu nije naloženo da ožiči Repozitorij cipela bean i dodati ga u kontekst aplikacije, stoga ga nije mogao ubrizgati i bacio je iznimku.

Dodavanje @ Repozitorij napomena natrag na Repozitorij cipela rješava problem.

5. Paket nije skeniran

Stavimo sada svoje Repozitorij cipela (zajedno s InventoryRepository) u zasebni paket pod nazivom com.baeldung.dependency.exception.repository.

Još jednom, kada pokrenemo našu aplikaciju, ona baca NezadovoljnoDependencyException . Da bismo to riješili, možemo konfigurirati skeniranje paketa na roditeljskom paketu i osigurati da su uključene sve relevantne klase:

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

6. Nejedinstveno rješavanje ovisnosti

Pretpostavimo da dodamo još jedan InventoryRepository provedba - DressRepository:

@Repository javna klasa DressRepository implementira InventoryRepository {} 

Sada, kada pokrenemo našu aplikaciju, ona će opet baciti NezadovoljnoDependencyException.

Međutim, ovaj je put situacija drugačija. Kako se to događa, ovisnost se ne može riješiti kada postoji više od jednog graha koji ga zadovoljava.

Da bismo to riješili, možda bismo htjeli dodati @Kvalifikator za razlikovanje spremišta:

@Qualifier ("haljine") @Repository javna klasa DressRepository implementira InventoryRepository {} 
@Qualifier ("shoes") @Repository javna klasa ShoeRepository implementira InventoryRepository {}

Također, morat ćemo dodati kvalifikator PurchaseDeptService ovisnost o konstruktoru:

javni PurchaseDeptService (@Qualifier ("haljine") spremište InventoryRepository) {this.repository = repozitorij; }

Ovo će učiniti DressRepository jedina održiva opcija, a Proljeće će je ubrizgati PurchaseDeptService.

7. Zaključak

U ovom smo članku vidjeli nekoliko najčešćih slučajeva susreta NezadovoljnoDependencyException. Također, naučili smo kako riješiti ove probleme.

Možda ćete htjeti pogledati i općenitiji vodič o Spring BeanCreationExceptionu.

Ovdje predstavljeni kod možete pronaći na GitHub-u.