스프링 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
(공장)에 모두 추가하면됩니다. 이론적으로는 사용할 수 있습니다. 실제로는 다음과 같이 나타납니다.
ConfigurationPropertiesBindingPostProcessor
이 초기화됩니다.- 선택적으로
ConversionService
에 의존합니다. - 스프링이 내
ConversionServiceFactoryBean
정의를 찾아서 시작합니다. - 불행히도
ConfigurationPropertiesBindingPostProcessor
은AutowiredAnnotationBeanPostProcessor
이 등록되기 전에 생성되었습니다. 따라서 모든 의존성은 autowired가 아닙니다. 따라서 모든 변환기가 자동 실행되지 않습니다.
이 동작을 방지하는 방법에 대한 아이디어가 있습니까? 아니면 Autowired 필드가있는 변환기를 사용할 수없는 것 같아서 ConversionService를 제거해야합니까?
AutowiredAnnotationBeanPostProcessor 순서가 Ordered.LOWEST_PRECEDENCE입니다 - 2; 및 ConfigurationPropertiesBindingPostProcessor 순서는 Ordered입니다 .HIGHEST_PRECEDENCE + 1; 높은 값은 낮은 우선 순위로 해석 될 수 있습니다. – crm86