Dependencia insatisfecha en primavera

1. Información general

En este tutorial rápido, explicaremos la excepción UnsatisfiedDependencyException de Spring , qué la causa y cómo evitarla.

2. Causa de la excepción de dependencia insatisfecha

UnsatisfiedDependencyException se lanza cuando, como sugiere el nombre, no se satisface alguna dependencia de bean o propiedad.

Esto puede suceder cuando la aplicación Spring intenta conectar un bean y no puede resolver una de las dependencias obligatorias.

3. Aplicación de ejemplo

Supongamos que tenemos una clase de servicio PurchaseDeptService , que depende 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); } } 

Por ahora, asumiremos que todas estas clases están ubicadas en el mismo paquete llamado com.baeldung.dependency.exception.app .

Cuando ejecutamos esta aplicación Spring Boot, todo funciona bien. Veamos con qué tipo de problemas podemos encontrarnos si nos saltamos un paso de configuración.

4. Falta la anotación de componente

Ahora, eliminemos la anotación @Repository de nuestra clase ShoeRepository :

public class ShoeRepository implements InventoryRepository { }

Cuando volvamos a iniciar nuestra aplicación, veremos el siguiente mensaje de error: UnsatisfiedDependencyException: Error al crear el bean con el nombre 'purchaseDeptService': Dependencia insatisfecha expresada a través del parámetro 0 del constructor

Spring no recibió instrucciones de conectar un bean ShoeRepository y agregarlo al contexto de la aplicación, por lo tanto, no pudo inyectarlo y lanzó la excepción.

Agregar la anotación @Repository nuevamente al ShoeRepository resuelve el problema.

5. Paquete no escaneado

Pongamos ahora nuestro ShoeRepository (junto con InventoryRepository ) en un paquete separado llamado com.baeldung.dependency.exception.repository.

Una vez más, cuando ejecutamos nuestra aplicación, arroja la excepción UnsatisfiedDependencyException . Para resolver esto, podemos configurar el escaneo del paquete en el paquete principal y asegurarnos de que todas las clases relevantes estén incluidas:

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

6. Resolución de dependencia no única

Supongamos que agregamos otra implementación de InventoryRepository : DressRepository :

@Repository public class DressRepository implements InventoryRepository { } 

Ahora, cuando ejecutamos nuestra aplicación, lanzará una vez más la excepción UnsatisfiedDependencyException.

Sin embargo, esta vez la situación es diferente. Da la casualidad de que la dependencia no se puede resolver cuando hay más de un bean que la satisface .

Para resolver esto, es posible que deseemos agregar @Qualifier para distinguir entre los repositorios:

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

Además, tendremos que agregar un calificador a la dependencia del constructor PurchaseDeptService :

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

Esto hará que DressRepository sea la única opción viable, y Spring la inyectará en PurchaseDeptService.

7. Conclusión

En este artículo, hemos visto varios casos más comunes de encontrar UnsatisfiedDependencyException. Además, hemos aprendido a resolver estos problemas.

Es posible que también desee ver el tutorial más general sobre Spring BeanCreationException.

El código presentado aquí se puede encontrar en GitHub.