문제

누락된 문제를 해결하는 데 시간을 보냈습니다. org.joda.time.DateTime->java.util.Date Spring Data의 변환기(Joda-Time이 클래스 경로에 있을 때 기본적으로 활성화되어야 함).이유를 찾았지만 다음과 같은 질문이 생겼습니다. @Configuration Spring의 주석.

다음을 사용하는 표준 애플리케이션 구성 AbstractMongoConfiguration spring-data-mongodb에서:

@Configuration
@ComponentScan
@EnableMongoRepositories
public class AppConfig extends AbstractMongoConfiguration { ... }

AppConfig 클래스를 명시적으로 사용하는 테스트(Spock을 사용하지만 내부적으로 spring-test에서 제공하는 메커니즘이 사용됨):

@ContextConfiguration(classes = AppConfig)
class JodaDocRepositorySpec extends Specification {

    @Autowired
    private JodaDocRepository jodaDocRepository

    def "save document with DateTime"() {
        given:
            def jodaDoc = new JodaDoc(DateTime.now())
        when:
            def savedJodaDoc = jodaDocRepository.save(jodaDoc)
        then:
            savedJodaDoc.id
    }
}

잘 작동합니다.그러나 AppConfig의 @Configuration 주석이 제거됨/댓글:

//@Configuration
@ComponentScan
@EnableMongoRepositories
public class AppConfig extends AbstractMongoConfiguration { ... }

다음과 같은 이유로 테스트가 실패합니다.

org.springframework.core.convert.ConverterNotFoundException:
No converter found capable of converting from type org.joda.time.DateTime to type java.util.Date

AFAIK는 사용할 필요가 없습니다 @Configuration 구성 클래스가 컨텍스트에 명시적으로 등록된 경우( @ContextConfiguration 또는 register() 방법 AnnotationConfigWebApplicationContext).어쨌든 클래스가 처리되고 선언된 모든 Bean이 발견됩니다.때로는 사용하지 않는 것이 유용할 때도 있습니다. @Configuration 서로 다른 테스트에서 사용되는 테스트 컨텍스트의 동일한 패키지에 2개의 유사한 구성 클래스가 있는 경우 구성 요소 스캔으로 감지되지 않도록 합니다.

그러므로 나는 사용법에 따라 컨텍스트에서 내부 빈 처리가 달라지는 Spring의 버그일 수 있다고 생각합니다. @Configuration 주석.이 두 가지 경우의 Spring 로그를 비교했는데 약간의 차이점이 있지만 Spring 내부 클래스에서는 원인이 무엇인지 확인할 수 없습니다.버그를 제출하기 전에 다음 사항을 묻고 싶습니다.

내 질문. 동일한 구성 클래스에 대해 Spring이 설명 가능한 이유가 있습니까(명시적으로 지적됨) @ContextConfiguration) 존재 여부에 따라 Joda-Time 변환기를 사용하거나 사용하지 않습니다. @Configuration 주석?

나는 또한 빠른 시작 프로젝트 문제를 재현하고 있습니다.봄-데이터-mongodb 1.3.3, 봄 4.0.0, joda-time 2.3.

도움이 되었습니까?

해결책

이 행동은 괜찮습니다. AbstractMongoConfiguration 에 의해 주석이 달렸습니다. @Configuration, 하지만 실제로 이 주석은 그렇지 않습니다. @Inherited, 이므로 클래스에 명시적으로 주석을 달아야 합니다.

제거할 때 @Configuration 주석을 달면 AppConfig 수업은 가득한 구성.이는 다음과 같은 프로세스입니다. 라이트 구성에 주석이 달린 메소드가 포함되어 있기 때문입니다. @Bean - 방법을 참조하세요. org.springframework.context.annotation.ConfigurationClassUtils

  • isFullConfigurationCandidate()
  • isLiteConfigurationCandidate()
  • isFullConfigurationClass()

마지막으로 가득한 (주석: @Configuration) 구성 클래스는 프로세스이며 구성 포스트 프로세서에 의해 향상되었습니다. ConfigurationClassPostProcessor.enhanceConfigurationClasses()

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top