애플리케이션 컨텍스트에서 일부 콩의 의존성이 사이클을 형성합니다.
Spring Boot v1.4.2에서 작업 중입니다.JPA를 사용한 릴리스 어플리케이션
저장소 인터페이스 및 구현 정의
ARepository
@Repository
public interface ARepository extends CrudRepository<A, String>, ARepositoryCustom, JpaSpecificationExecutor<A> {
}
ARepository 커스텀
@Repository
public interface ARepositoryCustom {
Page<A> findA(findAForm form, Pageable pageable);
}
ARepository Impl
@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;
}
...
}
응용 프로그램이 다음 메시지로 시작되지 않습니다.
***************************응용 프로그램 부팅 실패*************************** 설명: 응용 프로그램콘텍스트 내의 일부 콩의 의존성에 따라 사이클이 형성됩니다. | aRepository Impl└─────┘
http://docs.spring.io/spring-data/jpa/docs/current/reference/html/ #statorys.single-statory-intervisories에 기재되어 있는 모든 절차를 따랐습니다.
도와주세요!
로랑
사용하다@Lazy
이 순환을 끊는 간단한 방법은 스프링에게 콩 중 하나를 느긋하게 초기화하도록 요청하는 것입니다.즉, 콩을 완전히 초기화하지 않고 다른 콩에 삽입하는 프록시를 만듭니다.주입된 콩은 처음 필요할 때만 완전히 만들어집니다.
@Service
public class AServiceImpl implements AService {
private final ARepository aRepository;
public AServiceImpl(@Lazy ARepository aRepository) {
super();
this.aRepository = aRepository;
}
...
}
출처 : https://www.baeldung.com/circular-dependencies-in-spring
@Lazy 주석을 사용하면 해결됩니다.
@Component
public class Bean1 {
@Lazy
@Autowired
private Bean2 bean2;
}
원래의 문제에 대한 간단한 해결 방법이 있습니다.ARepositoryCustom 및 ARepositoryImpl에서 @Repository를 삭제하기만 하면 됩니다.모든 명명 및 인터페이스/클래스 계층을 유지합니다.다 괜찮아요.
소스코드를 테스트해 봤는데 뭔가 이상하더군요
우선, 당신의 소스코드에서 다음과 같은 에러가 발생했습니다.
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를 검색된 리포지토리 인터페이스 이름에 추가하는 명명 규칙을 따라야 합니다.이 포스트픽스는 디폴트로 [Inpact]으로 되어 있습니다.
이것을 pom.xml 파일에 추가합니다.난 괜찮아
spring.main.allow-circular-references:true
내 경우:나는 덧붙였다.
spring:
main:
allow-circular-references: true
application.yml로 이동합니다.
또는 추가할 수 있습니다.
spring.main.allow-circular-references=true
application.properties로 이동합니다.
application.yml 및 application.properties 파일은 모두 다음 디렉토리에 있습니다.
언급URL : https://stackoverflow.com/questions/41608705/the-dependencies-of-some-of-the-beans-in-the-application-context-form-a-cycle
'programing' 카테고리의 다른 글
플러그인 업로더의 업로드 디렉토리를 변경하는 방법 (0) | 2023.03.02 |
---|---|
개체를 호출할 수 없습니다.angularjs 키 (0) | 2023.03.02 |
jQuery Ajax가 404 오류를 반환하지만 올바른 응답입니다. (0) | 2023.03.02 |
XML 없이 스프링이 있는 속성을 기반으로 런타임에 다른 서비스를 주입하는 방법 (0) | 2023.03.02 |
Jersey JSON POJO 지원 사용방법 (0) | 2023.03.02 |