2016-08-16 5 views
2

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(工場)にそれらをすべて追加すると、それらを使用できます...理論的には。実際には、次のようになります。

  1. ConfigurationPropertiesBindingPostProcessorが初期化されます。
  2. オプションで、ConversionServiceに依存します。
  3. Springは私のConversionServiceFactoryBean定義を見つけて起動します。
  4. 残念ながらConfigurationPropertiesBindingPostProcessorAutowiredAnnotationBeanPostProcessorが登録される前に作成されます。したがって、依存関係のすべてはautowiredではありません。これは私のすべてのコンバータがautowiredされていないことにつながります。

誰もがこの現象を防止する方法はありますか?または、私はConversionServiceを取り除かなければならないのですか?Autowiredフィールドを持つConvertersを使用することができないようです。

+0

AutowiredAnnotationBeanPostProcessor順序はOrdered.LOWEST_PRECEDENCEある - 2。 ConfigurationPropertiesBindingPostProcessorの順序はOrdered.HIGHEST_PRECEDENCE + 1です。より高い値は、より低い優先度として解釈され得る。 – crm86

答えて

2

ConversionServiceconversionService,という名前は、自分が見つけたものを基本的に説明するものではありません。

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

これは熱心な構成のものによってロードされないこと(メソッド名に気づく)myConversionServiceを登録しようとしています。あなたには、いくつかのコンバータは、(ドキュメントで定義されている)設定から値を強制する必要がある場合は、ConfigurationPropertiesBindingでこれらのコンバータをマーキング考える:

@Component 
@ConfigurationPropertiesBinding 
// This can't autowire things either ... 
public class ExampleConverter implements MyConverter<Something, SomethingElse> { ... } 
関連する問題