2017-04-11 9 views
0

에 의해 anotated 클래스가 만들 무엇인가. 나는 실패했지만 이유는 확실하지 않았습니다. 그래서 비슷한 코드를 가진 또 다른 예제를 찾고 책을 보았습니다 "Craig Walls의 Action in Spring 4 판"봄 @ComponentScan 자동으로 할 수없는 것에 대한 원인은 내 유스 케이스를 피팅 할 듯를 구현 시도한 <a href="https://www.petrikainulainen.net/programming/spring-framework/spring-data-jpa-tutorial-part-eight-adding-functionality-to-a-repository/" rel="nofollow noreferrer">tutorial</a> 건너 온 @Repository

이 책은 300 페이지에서 동일한 기본 접근법을 설명합니다. JdbcTemplate Bean을 먼저 정의하십시오.

@Bean 
NamedParameterJdbcTemplate jdbcTemplate(DataSource dataSource) { 
    return new NamedParameterJdbcTemplate(dataSource); 
} 

그런 다음

@Repository 
public class CustomRepositoryImpl implements CustomRepository { 

private final NamedParameterJdbcOperations jdbcOperations; 

private static final String TEST_STRING = ""; 

@Autowired 
public CustomRepositoryImpl(NamedParameterJdbcOperations jdbcOperations) { 
    this.jdbcOperations = jdbcOperations; 
} 

그래서 나는이 책이 시사의 예제처럼 한 인터페이스를 구현하는 저장소는 테스트를 작성하지만 오류 메시지를 가지고 이름을 가진 bean을 생성

오류 'de.myproject.config.SpringJPAPerformanceConfigTest': 필드 'abc'를 통해 표현 된 충족되지 않은 종속성. 상자의 예외는 org.springframework.beans.factory.NoSuchBeanDefinitionException 없습니다 : 자동으로 묶어 후보 자격을 예상 적어도 1 콩 'de.myproject.CustomRepository'가능한 유형의 어떠한 자격 콩. 종속성 주석 : 책과 튜토리얼 설명과 같은 내 이해에

은 저장소가 구성 요소 스캔하여 Bean 정의로 인식되어야한다 {org.springframework.beans.factory.annotation.Autowired @는 (= TRUE 필수)} . 이 테스트하려면

가 나는 컨텍스트를 생성하고 등록 된 모든 콩에 대해 물었다.

AnnotationConfigApplicationContext 
context = new AnnotationConfigApplicationContext(); 
context.getBeanDefinitionNames() 

가정 내 저장소는 그 중 하나가 아닙니다. 그래서 테스트 목적으로 만 프로젝트의 검색 범위를 늘리고 기본 패키지로 설정했습니다. Repository를 제외한 다른 모든 Bean이 표시되었습니다. 구성 요소 검사 및 autowiring을하는 대신

, 책은 단순히 내가했던 콩,로 저장소를 선언 할 수있는 가능성에 대해 설명합니다.

@Bean 
public CustomRepository(NamedParameterJdbcOperations jdbcOperations) { 
    return new CustomRepositoryImpl(jdbcOperations); 
} 

그 후 Spring은 저장소를 연결할 수있었습니다. 나는이 책의 github code을 더 잘 이해하기를 희망했지만, 안타깝게도 실행되는 Bean 솔루션 만 구현되었다.

그래서 여기 내 질문이 있습니다 :

1)가 아닌 구성 요소에 의해 인식이 하나, 검사에게 같은 시나리오는 bean 정의를 위해 가능한 어떤 이유가 있습니까?

2)이 프로젝트는 이미 봄 JPA 데이터 저장소는 동시에 두 가지 접근 방식을 사용하지 않는 어떤 이유가 사용?

+0

@ComponentScan 주석에서 알리고있는 패키지와 리포지토리가 하위 패키지에 있는지 확인할 수 있습니까? –

+0

@ComponentScan (basePackages = { "de.myproject. *"}) 저장소가 하위 패키지 de.myproject.performance에 있으면 다른 하위 패키지의 다른 모든 bean이 있지만 어쩌면 몇 가지 특별한 규칙이 있습니다 @Repositorys를 위해 나는 모르고있다. – aldr

답변

0

문제는 클래스의 이름 지정입니다. 여기에서 이해해야 할 많은 것들이 있습니다.
1. 당신은 인터페이스 @Repository 그것이 CRUDRepository 또는 스프링 데이터에 의해 제공되는 저장소 중 하나를 확장 제공되는 선택 사항입니다 저장소를 정의합니다. 이 수업에서는 메서드를 선언 할 수 있습니다 (찾기 ....). 그리고 spring-data는 기본 데이터베이스를 기반으로 쿼리를 공식화합니다. @Query를 사용하여 쿼리를 지정할 수도 있습니다.
2.예를 들어 JdbcTemplate 또는 MongoTemplate과 같은 기본 템플릿 클래스를 사용할 수있는 복잡한 쿼리 또는 스프링 데이터로는 사용할 수없는 메서드가 있다고 가정합니다.
3이 작업을 수행하는 방법은 다음과 같습니다. 다른 인터페이스와 Impl 클래스. 이 인터페이스의 이름은 Custom과 같아야하고 Impl 클래스의 이름은 Impl이어야합니다. 그리고 모두 동일한 패키지에 있어야합니다.

예를 들어 리포지토리 이름이 AbcRepository 인 경우 사용자 지정 리포지토리의 이름은 AbcRepositoryCustom이어야하며 구현 이름은 AbcRepositoryImpl입니다. AbcRepository는 AbcRepositoryCustom (및 다른 스프링 데이터 리포지토리)을 확장합니다. 그리고 AbcRepositoryImpl은 AbcRepositoryCustom을 구현합니다.

0

나는 스스로 문제를 "해결할"수있었습니다.

우리는 또한 실제로 내가 오프를 인식하지 않았다 두 개의 동일한 @ComponentScan의 주석이 있었다 @ComponentScan

@EnableWebMvc 
@Configuration 
@ComponentScan(basePackages = {"de.myproject.*"}) 

동일한 basePackage 주석 프런트 엔드 클래스를 가지고 있으며이 충돌로 리드했던 것처럼 . 전체 응용 프로그램을로드해야하는 순서가 바뀌었지만 추측 된 내용 만 변경되었습니다.

는 단순히 서브 패키지 내 Repository하고 Impl 이동하고

@ComponentScan(basePackages = {"de.myproject.subpackage.*"}) 

을 변경하고 지금은 모든 것이 잘 작동합니다. 그것이 나를 벗어나지 만,이 행동의 정확한 이유는 무엇입니까.