Dépendance insatisfaite au printemps

1. Vue d'ensemble

Dans ce tutoriel rapide, nous expliquerons l' exception UnsatisfiedDependencyException de Spring , ce qui la cause et comment l'éviter.

2. Cause de l' exception UnsatisfiedDependencyException

UnsatisfiedDependencyException est levée lorsque, comme son nom l'indique, une dépendance de bean ou de propriété n'est pas satisfaite.

Cela peut se produire lorsque l'application Spring tente de câbler un bean et ne peut pas résoudre l'une des dépendances obligatoires.

3. Exemple d'application

Supposons que nous ayons une classe de service PurchaseDeptService , qui dépend de InventoryRepository:

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

Pour l'instant, nous supposerons que toutes ces classes sont situées dans le même package nommé com.baeldung.dependency.exception.app .

Lorsque nous exécutons cette application Spring Boot, tout fonctionne correctement. Voyons quels types de problèmes nous pouvons rencontrer si nous sautons une étape de configuration.

4. Annotation de composant manquante

Maintenant, supprimons l' annotation @Repository de notre classe ShoeRepository :

public class ShoeRepository implements InventoryRepository { }

Lorsque nous redémarrons notre application, nous verrons le message d'erreur suivant: UnsatisfiedDependencyException: Erreur lors de la création du bean avec le nom 'purchaseDeptService': Dépendance non satisfaite exprimée via le paramètre du constructeur 0

Spring n'a pas été invité à câbler un bean ShoeRepository et à l'ajouter au contexte de l'application, il n'a donc pas pu l'injecter et a levé l'exception.

L'ajout de l' annotation @Repository à ShoeRepository résout le problème.

5. Paquet non scanné

Mettons maintenant notre ShoeRepository (avec InventoryRepository ) dans un package distinct nommé com.baeldung.dependency.exception.repository.

Encore une fois, lorsque nous exécutons notre application, elle lève l' exception UnsatisfiedDependencyException . Pour résoudre ce problème, nous pouvons configurer l'analyse du package sur le package parent et nous assurer que toutes les classes pertinentes sont incluses:

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

6. Résolution de dépendance non unique

Supposons que nous ajoutions une autre implémentation d' InventoryRepository - DressRepository :

@Repository public class DressRepository implements InventoryRepository { } 

Maintenant, lorsque nous exécutons notre application, elle lèvera à nouveau l' exception UnsatisfiedDependencyException.

Cependant, cette fois, la situation est différente. En l'occurrence, la dépendance ne peut pas être résolue lorsqu'il y a plus d'un bean qui la satisfait .

Pour résoudre ce problème, nous souhaitons peut-être ajouter @Qualifier pour distinguer les référentiels:

@Qualifier("dresses") @Repository public class DressRepository implements InventoryRepository { } 
@Qualifier("shoes") @Repository public class ShoeRepository implements InventoryRepository { }

De plus, nous devrons ajouter un qualificatif à la dépendance du constructeur PurchaseDeptService :

public PurchaseDeptService(@Qualifier("dresses") InventoryRepository repository) { this.repository = repository; }

Cela fera de DressRepository la seule option viable, et Spring l'injectera dans PurchaseDeptService.

7. Conclusion

Dans cet article, nous avons vu plusieurs cas les plus courants de rencontre avec UnsatisfiedDependencyException. De plus, nous avons appris à résoudre ces problèmes.

Vous pouvez également consulter le didacticiel plus général sur Spring BeanCreationException.

Le code présenté ici se trouve à l'adresse over sur GitHub.