Зависимости некоторых компонентов в контексте приложения образуют цикл
Я работаю над Spring Boot v1.4.2.Выпуск приложения с JPA.
я определил интерфейсы репозитория и реализации
ARepository
@Repository
public interface ARepository extends CrudRepository<A, String>, ARepositoryCustom, JpaSpecificationExecutor<A> {
}
ARepositoryCustom
@Repository
public interface ARepositoryCustom {
Page<A> findA(findAForm form, Pageable pageable);
}
ARepositoryImpl
@Repository
public class ARepositoryImpl implements ARepositoryCustom {
@Autowired
private ARepository aRepository;
@Override
public Page<A> findA(findAForm form, Pageable pageable) {
return aRepository.findAll(
where(ASpecs.codeLike(form.getCode()))
.and(ASpecs.labelLike(form.getLabel()))
.and(ASpecs.isActive()),
pageable);
}
}
и услуги AServiceImpl
@Service
public class AServiceImpl implements AService {
private ARepository aRepository;
public AServiceImpl(ARepository aRepository) {
super();
this.aRepository = aRepository;
}
...
}
мое приложение не будет начинаться с сообщения:
*************************** APPLICATION FAILED TO START *************************** Description: The dependencies of some of the beans in the application context form a cycle: | aRepositoryImpl └─────┘
I следовал всем шагам, описанным в http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.single-repository-behaviour
пожалуйста, помогите !
Лорен
2 ответов
есть простое исправление для вашей первоначальной проблемы: Просто удалите @Repository из ARepositoryCustom и из ARepositoryImpl. Сохраните все иерархии именования и интерфейса / класса. Они все в порядке.
Я проверил исходный код, и нашел что-то хитрое.
во-первых, с вашим исходным кодом я получил следующую ошибку:
There is a circular dependency between 1 beans in the application context:
- ARepositoryImpl (field private test.ARepository test.ARepositoryImpl.aRepository)
- aRepositoryImpl
тогда, я думаю, Весна "запуталась" между ARepository
(репозиторий JPA) и ARepositoryImpl
(пользовательские репозитории).
Итак, я бы предложил вам переименовать ARepository
к чему-то еще, например BRepository
. Это сработало, если я переименовал имя класса.
согласно официальной документации данных по весны (https://docs.spring.io/spring-data/jpa/docs/current/reference/html/) :
эти классы должны следовать соглашению об именах добавления атрибута repository-impl-postfix элемента пространства имен к имени интерфейса найденного репозитория. этот постфикс по умолчанию Impl