Spring 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
は、SpringのConverter
拡張するだけでマーカーインターフェイスです)Converter
Sを作成できることを期待してい...を経由して、それを作成しよう
@Component
public class ExampleConverter implements MyConverter<Something, SomethingElse> {
@Autowired
private SomeService someService;
... }
春はMyConverter
をすべて見つけ、ConversionService
(工場)にそれらをすべて追加すると、それらを使用できます...理論的には。実際には、次のようになります。
ConfigurationPropertiesBindingPostProcessor
が初期化されます。- オプションで、
ConversionService
に依存します。 - Springは私の
ConversionServiceFactoryBean
定義を見つけて起動します。 - 残念ながら
ConfigurationPropertiesBindingPostProcessor
はAutowiredAnnotationBeanPostProcessor
が登録される前に作成されます。したがって、依存関係のすべてはautowiredではありません。これは私のすべてのコンバータがautowiredされていないことにつながります。
誰もがこの現象を防止する方法はありますか?または、私はConversionServiceを取り除かなければならないのですか?Autowiredフィールドを持つConvertersを使用することができないようです。
AutowiredAnnotationBeanPostProcessor順序はOrdered.LOWEST_PRECEDENCEある - 2。 ConfigurationPropertiesBindingPostProcessorの順序はOrdered.HIGHEST_PRECEDENCE + 1です。より高い値は、より低い優先度として解釈され得る。 – crm86