Dépendance insatisfaite au printemps

Dépendance non satisfaite au printemps

1. Vue d'ensemble

Dans ce rapide didacticiel, nous expliquerons lesUnsatisfiedDependencyException de Spring, leurs causes et comment les éviter.

2. Cause deUnsatisfiedDependencyException

UnsatisfiedDependencyException est renvoyé 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 servicePurchaseDeptService, qui dépend deInventoryRepository:

@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.example.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 classeShoeRepository:

public class ShoeRepository implements InventoryRepository {
}

Lorsque nous redémarrerons notre application, nous verrons le message d'erreur suivant:UnsatisfiedDependencyException: Error creating bean with name ‘purchaseDeptService': Unsatisfied dependency expressed through constructor parameter 0

Spring n’a pas reçu pour instruction de câbler un beanShoeRepository et de l’ajouter au contexte de l’application, il n’a donc pas pu l’injecter et a lancé l’exception.

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

5. Paquet non analysé

Mettons maintenant nosShoeRepository (avecInventoryRepository) dans un package séparé nommécom.example.dependency.exception.repository.

Encore une fois, lorsque nous exécutons notre application, elle lance lesUnsatisfiedDependencyException. 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.example.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 deInventoryRepository -DressRepository:

@Repository
public class DressRepository implements InventoryRepository {
}

Maintenant, lorsque nous exécuterons notre application, elle lancera à nouveau lesUnsatisfiedDependencyException.

Cependant, cette fois, la situation est différente. En l'occurrence, lesdependency cannot be resolved when there’s more than one bean that satisfies it.

Pour résoudre ce problème, nous pouvons souhaiter 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 dePurchaseDeptService:

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

Cela fera deDressRepository la seule option viable, et Spring l'injectera dansPurchaseDeptService.

7. Conclusion

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

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

Le code présenté ici peut être trouvéover on GitHub.