it-swarm.com.ru

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

Я работаю над приложением Spring Boot v1.4.2.RELEASE с 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;
    }
    ...
}

Мое приложение не запустится с сообщением:

 *************************** 
 Приложение не удалось запустить 
 ********** ***************** 

 Описание: 

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

 | aRepositoryImpl 
 └─────┘ 

Я выполнил все шаги, описанные в http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.single-repository-behaviour

Пожалуйста помоги !

Laurent

8
Laurent Maillet

Существует простое решение вашей исходной проблемы: Просто удалите @Repository из ARepositoryCustom и из ARepositoryImpl . Сохраните все иерархии именования и интерфейса/класса. Они все в порядке.

5
Andrei Pietrusel

Я проверил ваш исходный код и нашел что-то хитрое.

Во-первых, с вашим исходным кодом я получил следующую ошибку:

There is a circular dependency between 1 beans in the application context:
- ARepositoryImpl (field private test.ARepository test.ARepositoryImpl.aRepository)
- aRepositoryImpl

Затем, я думаю, Spring «запутался» между ARepository (репозиторий JPA) и ARepositoryImpl (пользовательский репозиторий). Итак, я бы посоветовал вам переименоватьARepository во что-то еще, например, BRepository. Это сработало, если я переименовал имя класса.

Согласно официальной документации Spring Data ( https://docs.spring.io/spring-data/jpa/docs/current/reference/html/ ): 

Эти классы должны следовать соглашению об именах, добавляя атрибут repository-impl-postfix элемента пространства имен к найденному имени интерфейса репозитория. Этот постфикс по умолчанию Impl

2
Phat H. VU