Misfornøyd avhengighet om våren

1. Oversikt

I denne raske opplæringen forklarer vi vårens Misfornøyd avhengighet unntak, hva som forårsaker det, og hvordan du kan unngå det.

2. Årsak til Misfornøyd avhengighet unntak

Misfornøyd avhengighet unntak blir kastet når noen, som navnet antyder, ikke er avhengig av bønner eller eiendom.

Dette kan skje når vårapplikasjon prøver å koble en bønne og ikke kan løse en av de obligatoriske avhengighetene.

3. Eksempel på applikasjon

Anta at vi har en serviceklasse PurchaseDeptService, som avhenger av InventoryRepository:

@Service offentlig klasse PurchaseDeptService {public PurchaseDeptService (InventoryRepository repository) {this.repository = repository; }}
offentlig grensesnitt InventoryRepository {} 
@Repository public class ShoeRepository implementerer InventoryRepository {}
@SpringBootApplication public class SpringDependenciesExampleApplication {public static void main (String [] args) {SpringApplication.run (SpringDependenciesExampleApplication.class, args); }} 

Foreløpig antar vi at alle disse klassene ligger i samme pakke com.baeldung.dependency.exception.app.

Når vi kjører denne Spring Boot-applikasjonen, fungerer alt bra. La oss se hva slags problemer vi kan støte på hvis vi hopper over et konfigurasjonstrinn.

4. Komponentkommentar mangler

La oss nå fjerne @Oppbevaringssted kommentar fra vår Skobutikk klasse:

offentlig klasse ShoeRepository implementerer InventoryRepository {}

Når vi starter søknaden på nytt, ser vi følgende feilmelding: UnsatisfiedDependencyException: Feil ved oppretting av bønne med navnet 'purchaseDeptService': Utilfreds avhengighet uttrykt gjennom konstruktørparameter 0

Våren ble ikke bedt om å koble til en Skobutikk bønne og legg den til applikasjonssammenheng, og kunne derfor ikke injisere den og kastet unntaket.

Legge til @Oppbevaringssted kommentar tilbake til Skobutikk løser problemet.

5. Pakke ikke skannet

La oss nå sette vår Skobutikk (sammen med InventoryRepository) i en egen pakke som heter com.baeldung.dependency.exception.repository.

Nok en gang, når vi kjører appen vår, kaster den Misfornøyd avhengighet unntak . For å løse dette kan vi konfigurere pakkeskanningen på foreldrepakken og sørge for at alle relevante klasser er inkludert:

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

6. Ikke-unik avhengighetsoppløsning

Anta at vi legger til en annen InventoryRepository gjennomføring - DressRepository:

@Repository public class DressRepository implementerer InventoryRepository {} 

Nå, når vi kjører appen vår, vil den nok en gang kaste Misfornøyd avhengighet unntak.

Men denne gangen er situasjonen en annen. Når det skjer, vil avhengighet kan ikke løses når det er mer enn en bønne som tilfredsstiller den.

For å løse dette kan det være lurt å legge til @Kvalifiserende for å skille mellom lagringene:

@Qualifier ("kjoler") @Repository offentlig klasse DressRepository implementerer InventoryRepository {} 
@Qualifier ("sko") @Repository offentlig klasse ShoeRepository implementerer InventoryRepository {}

Vi må også legge til en kvalifisering til PurchaseDeptService konstruktøravhengighet:

offentlig PurchaseDeptService (@Qualifier ("kjoler") InventoryRepository repository) {this.repository = repository; }

Dette vil gjøre DressRepository det eneste levedyktige alternativet, og Spring vil injisere det i PurchaseDeptService.

7. Konklusjon

I denne artikkelen har vi sett flere vanligste tilfeller av å møte Misfornøyd avhengighet unntak. Vi har også lært hvordan vi kan løse disse problemene.

Det kan også være lurt å se på den mer generelle veiledningen om Spring BeanCreationException.

Koden som presenteres her finner du på GitHub.


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