Ontevreden afhankelijkheid in het voorjaar

1. Overzicht

In deze korte tutorial leggen we de lente uit UnsatisfiedDependencyException, waardoor het wordt veroorzaakt en hoe u het kunt vermijden.

2. Oorzaak van UnsatisfiedDependencyException

UnsatisfiedDependencyException wordt gegooid wanneer, zoals de naam suggereert, niet wordt voldaan aan een bepaalde boon- of eigendomsafhankelijkheid.

Dit kan gebeuren wanneer de Spring-applicatie een boon probeert te bedraden en een van de verplichte afhankelijkheden niet kan oplossen.

3. Voorbeeldtoepassing

Stel dat we een serviceklasse hebben AankoopDeptService, die afhangt van Inventaris Opslagplaats:

@Service openbare klasse PurchaseDeptService {openbare PurchaseDeptService (InventoryRepository-repository) {this.repository = repository; }}
openbare interface InventoryRepository {} 
@Repository openbare klasse ShoeRepository implementeert InventoryRepository {}
@SpringBootApplication openbare klasse SpringDependenciesExampleApplication {openbare statische leegte hoofd (String [] args) {SpringApplication.run (SpringDependenciesExampleApplication.class, args); }} 

Voorlopig gaan we ervan uit dat al deze klassen zich in hetzelfde pakket bevinden met de naam com.baeldung.dependency.exception.app.

Als we deze Spring Boot-applicatie draaien, werkt alles prima. Laten we eens kijken wat voor soort problemen we kunnen tegenkomen als we een configuratiestap overslaan.

4. Componentannotatie ontbreekt

Laten we nu het @Repository annotatie van onze ShoeRepository klasse:

openbare klasse ShoeRepository implementeert InventoryRepository {}

Wanneer we onze applicatie opnieuw starten, zien we het volgende foutbericht: UnsatisfiedDependencyException: fout bij het maken van bean met de naam ‘purchaseDeptService ': ontevredenheid uitgedrukt via constructorparameter 0

De lente was niet geïnstrueerd om een ShoeRepository bean en voeg het toe aan de toepassingscontext, dus kon het niet injecteren en gooide de uitzondering.

Het toevoegen van de @Repository annotatie terug naar de ShoeRepository lost het probleem op.

5. Pakket niet gescand

Laten we nu onze ShoeRepository (samen met Inventaris Opslagplaats) in een apart pakket met de naam com.baeldung.dependency.exception.repository.

Nogmaals, wanneer we onze app uitvoeren, gooit het de UnsatisfiedDependencyException . Om dit op te lossen, kunnen we de pakketscan op het bovenliggende pakket configureren en ervoor zorgen dat alle relevante klassen zijn opgenomen:

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

6. Oplossing van niet-unieke afhankelijkheid

Stel dat we er nog een toevoegen Inventaris Opslagplaats implementatie - DressRepository:

@Repository openbare klasse DressRepository implementeert InventoryRepository {} 

Nu, wanneer we onze app uitvoeren, zal het opnieuw de UnsatisfiedDependencyException.

Deze keer is de situatie echter anders. Toevallig is de afhankelijkheid kan niet worden opgelost als er meer dan één boon is die eraan voldoet.

Om dit op te lossen, willen we misschien toevoegen @Kwalificatie om onderscheid te maken tussen de repositories:

@Qualifier ("jurken") @Repository openbare klasse DressRepository implementeert InventoryRepository {} 
@Qualifier ("schoenen") @Repository openbare klasse ShoeRepository implementeert InventoryRepository {}

We zullen ook een kwalificatie moeten toevoegen aan AankoopDeptService afhankelijkheid van constructeurs:

openbare PurchaseDeptService (@Qualifier ("jurken") InventoryRepository repository) {this.repository = repository; }

Dit zal maken DressRepository de enige haalbare optie, en Spring zal het in injecteren AankoopDeptService.

7. Conclusie

In dit artikel hebben we een aantal meest voorkomende gevallen van ontmoeting gezien UnsatisfiedDependencyException. We hebben ook geleerd hoe we deze problemen kunnen oplossen.

Misschien wil je ook de meer algemene tutorial over Spring BeanCreationException bekijken.

De code die hier wordt gepresenteerd, is te vinden op GitHub.