2016-08-16 2 views
2

스프링 ConversionService을 사용할 때 문제가 발견되었습니다 (처음에는이 문제가 내 테스트와 관련이 있다고 생각했으나 이것이 내 실수였습니다. 항상 발생합니다). 나는 ...ConfigurationPropertiesBindingPostProcessor로 인해 @Autowired가 발생했습니다.

@Configuration 
@ComponentScan(basePackages={"com.mybasepacke"}) 
public class MyConfiguration { 

    @Bean 
    @SuppressWarnings("rawtypes") 
    public ConversionServiceFactoryBean conversionService(ApplicationContext context) { 

     ConversionServiceFactoryBean factory = new ConversionServiceFactoryBean(); 

     Map<String, MyConverter> converters = context.getBeansOfType(MyConverter.class); 
     factory.setConverters(new HashSet<>(converters.values())); 
     factory.afterPropertiesSet(); 

     return factory; 
    } 
} 

이 방법은, 단순히 이런 (MyConverter 봄의 Converter 확장 단지 마커 인터페이스) Converter의를 만들 수 있기를 기대 ... 통해 그것을 만들려고

@Component 
public class ExampleConverter implements MyConverter<Something, SomethingElse> { 

    @Autowired 
    private SomeService someService; 
... } 

봄은 MyConverter을 모두 찾아 ConversionService (공장)에 모두 추가하면됩니다. 이론적으로는 사용할 수 있습니다. 실제로는 다음과 같이 나타납니다.

  1. ConfigurationPropertiesBindingPostProcessor이 초기화됩니다.
  2. 선택적으로 ConversionService에 의존합니다.
  3. 스프링이 내 ConversionServiceFactoryBean 정의를 찾아서 시작합니다.
  4. 불행히도 ConfigurationPropertiesBindingPostProcessorAutowiredAnnotationBeanPostProcessor이 등록되기 전에 생성되었습니다. 따라서 모든 의존성은 autowired가 아닙니다. 따라서 모든 변환기가 자동 실행되지 않습니다.

이 동작을 방지하는 방법에 대한 아이디어가 있습니까? 아니면 Autowired 필드가있는 변환기를 사용할 수없는 것 같아서 ConversionService를 제거해야합니까?

+0

AutowiredAnnotationBeanPostProcessor 순서가 Ordered.LOWEST_PRECEDENCE입니다 - 2; 및 ConfigurationPropertiesBindingPostProcessor 순서는 Ordered입니다 .HIGHEST_PRECEDENCE + 1; 높은 값은 낮은 우선 순위로 해석 될 수 있습니다. – crm86

답변

2

ConversionServiceconversionService, check the doc은 기본적으로 자신이 무엇을 발견했는지 설명합니다.

@Bean 
public ConversionService myConversionService() { 
    // your setup 
} 

이것은 myConversionService 간절히 구성 재료에 의해로드 할 수없는 것 (메소드 이름을 알) 등록 할 것입니다. 당신이 (해당 문서에 정의 된대로) 구성에서 값을 강요하는 일부 변환기가 필요하면, ConfigurationPropertiesBinding와 그 컨버터를 표시 고려해

@Component 
@ConfigurationPropertiesBinding 
// This can't autowire things either ... 
public class ExampleConverter implements MyConverter<Something, SomethingElse> { ... } 
관련 문제