Dipendenza insoddisfatta in primavera

1. Panoramica

In questo breve tutorial, spiegheremo Spring's UnsatisfiedDependencyException , cosa lo causa e come evitarlo.

2. Causa di UnsatisfiedDependencyException

UnsatisfiedDependencyException viene generata quando, come suggerisce il nome, alcune dipendenze di bean o proprietà non sono soddisfatte.

Ciò può accadere quando l'applicazione Spring tenta di collegare un bean e non è in grado di risolvere una delle dipendenze obbligatorie.

3. Applicazione di esempio

Supponiamo di avere una classe di servizio PurchaseDeptService , che dipende da 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); } } 

Per ora, supponiamo che tutte queste classi si trovino nello stesso pacchetto denominato com.baeldung.dependency.exception.app .

Quando eseguiamo questa applicazione Spring Boot, tutto funziona correttamente. Vediamo che tipo di problemi possiamo incontrare se saltiamo un passaggio di configurazione.

4. Annotazione componente mancante

Ora, rimuoviamo l' annotazione @Repository dalla nostra classe ShoeRepository :

public class ShoeRepository implements InventoryRepository { }

Quando riavviamo la nostra applicazione, vedremo il seguente messaggio di errore: UnsatisfiedDependencyException: Errore durante la creazione del bean con il nome 'purchaseDeptService': dipendenza insoddisfatta espressa tramite il parametro del costruttore 0

Spring non è stato incaricato di collegare un bean ShoeRepository e di aggiungerlo al contesto dell'applicazione, quindi non è stato possibile iniettarlo e ha generato l'eccezione.

L' aggiunta dell'annotazione @Repository a ShoeRepository risolve il problema.

5. Pacchetto non scansionato

Mettiamo ora il nostro ShoeRepository (insieme a InventoryRepository ) in un pacchetto separato denominato com.baeldung.dependency.exception.repository.

Ancora una volta, quando eseguiamo la nostra app, viene generata l' eccezione UnsatisfiedDependencyException . Per risolvere questo problema, possiamo configurare la scansione del pacchetto sul pacchetto padre e assicurarci che tutte le classi rilevanti siano incluse:

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

6. Risoluzione delle dipendenze non univoca

Supponiamo di aggiungere un'altra implementazione di InventoryRepository - DressRepository :

@Repository public class DressRepository implements InventoryRepository { } 

Ora, quando eseguiamo la nostra app, verrà nuovamente lanciata l' eccezione UnsatisfiedDependencyException.

Tuttavia, questa volta la situazione è diversa. In effetti , la dipendenza non può essere risolta quando c'è più di un bean che la soddisfa .

Per risolvere questo problema, potremmo voler aggiungere @Qualifier per distinguere tra i repository:

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

Inoltre, dovremo aggiungere un qualificatore alla dipendenza del costruttore di PurchaseDeptService :

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

Questo renderà DressRepository l'unica opzione praticabile e Spring lo inserirà in PurchaseDeptService.

7. Conclusione

In questo articolo, abbiamo visto diversi casi più comuni di incontro con UnsatisfiedDependencyException. Inoltre, abbiamo imparato come risolvere questi problemi.

Potresti anche voler guardare il tutorial più generale su Spring BeanCreationException.

Il codice presentato qui può essere trovato su GitHub.