Зависимости некоторых компонентов в контексте приложения образуют цикл

Я работаю над 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