«1. Обзор
В этом кратком руководстве мы объясним Spring UnsatisfiedDependencyException, что вызывает его и как его избежать.
2. Причина исключения UnsatisfiedDependencyException
Исключение UnsatisfiedDependencyException возникает, когда, как следует из названия, зависимость какого-либо компонента или свойства не удовлетворена.
Это может произойти, когда приложение Spring пытается связать компонент и не может разрешить одну из обязательных зависимостей.
3. Пример приложения
Предположим, у нас есть сервисный класс PurchaseDeptService, который зависит от 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);
}
}
Сейчас мы будем считать, что все эти классы находится в том же пакете с именем com.baeldung.dependency.exception.app.
Когда мы запускаем это приложение Spring Boot, все работает нормально. Давайте посмотрим, с какими проблемами мы можем столкнуться, если пропустим шаг настройки.
public class ShoeRepository implements InventoryRepository {
}
4. Отсутствует аннотация компонента
Теперь давайте удалим аннотацию @Repository из нашего класса ShoeRepository:
Когда мы снова запустим наше приложение, мы увидим следующее сообщение об ошибке: UnsatisfiedDependencyException: Error create бин с именем «purchaseDeptService»: неудовлетворенная зависимость, выраженная через параметр конструктора 0
Добавление аннотации @Repository обратно в ShoeRepository решает проблему.
5. Пакет не просканирован
Теперь поместим наш ShoeRepository (вместе с InventoryRepository) в отдельный пакет с именем com.baeldung.dependency.exception.repository.
@SpringBootApplication
@ComponentScan(basePackages = {"com.baeldung.dependency.exception"})
public class SpringDependenciesExampleApplication {
public static void main(String[] args) {
SpringApplication.run(SpringDependenciesExampleApplication.class, args);
}
}
Еще раз, когда мы запускаем наше приложение, оно генерирует исключение UnsatisfiedDependencyException. Чтобы решить эту проблему, мы можем настроить сканирование пакета в родительском пакете и убедиться, что включены все соответствующие классы:
6. Разрешение неуникальных зависимостей
@Repository
public class DressRepository implements InventoryRepository {
}
Предположим, мы добавляем еще одну реализацию InventoryRepository — DressRepository. :
Теперь, когда мы запускаем наше приложение, оно снова выдает исключение UnsatisfiedDependencyException.
Однако на этот раз ситуация иная. Как это бывает, зависимость не может быть разрешена, когда есть более одного компонента, который ее удовлетворяет.
@Qualifier("dresses")
@Repository
public class DressRepository implements InventoryRepository {
}
@Qualifier("shoes")
@Repository
public class ShoeRepository implements InventoryRepository {
}
Чтобы решить эту проблему, мы можем добавить @Qualifier, чтобы различать репозитории:
public PurchaseDeptService(@Qualifier("dresses") InventoryRepository repository) {
this.repository = repository;
}
Кроме того, нам нужно добавить квалификатор в зависимость конструктора PurchaseDeptService:
Это сделает DressRepository единственным жизнеспособным вариантом, и Spring внедрит его в PurchaseDeptService.
7. Заключение
В этой статье мы рассмотрели несколько наиболее распространенных случаев возникновения исключения UnsatisfiedDependencyException. Кроме того, мы научились решать эти проблемы.