2017-09-22 3 views
0

カスタムコンバーターでConversionServiceを作成します。私はConversionServiceFactoryBeanを作成し、その上にコンバータを設定することにより、ConversionServiceを作成しようとした別のquestionに触発さConversionServiceFactoryBeanまたはGenericConversionServiceを使用してカスタムコンバータを登録しますか?

@Bean 
public ConversionService conversionService(
     Set<Converter<?, ?>> converters, 
     ConversionServiceFactoryBean factory) { 
    factory.setConverters(converters); 
    return factory.getObject(); 
} 

@Bean 
public ConversionServiceFactoryBean conversionServiceFactoryBean() { 
    return new ConversionServiceFactoryBean(); 
} 

Spring documentationはXMLで多かれ少なかれ同じことを示唆している:

<bean id="conversionService" 
     class="org.springframework.context.support.ConversionServiceFactoryBean"> 
    <property name="converters"> 
     <set> 
      <bean class="example.MyCustomConverter"/> 
     </set> 
    </property> 
</bean> 

ConversionServiceを設定すると、my caseでは機能しませんでした。私のクラスでautowired conversionServiceを使用しようとしたときに、エラーが発生しました。

ConverterNotFoundException: No converter found capable of converting from type [java.lang.String] to type [java.time.Duration] 

私はGenericConversionServiceを使用して、それを私のコンバータを追加する必要がありました:

@Bean 
public ConversionService conversionService(Set<Converter<?, ?>> converters) { 
    final GenericConversionService conversionService = new GenericConversionService(); 
    converters.forEach(conversionService::addConverter); 
    return conversionService; 
} 

は、今では動作しますが、私はそれがConversionServiceFactoryBeanでは動作しない理由を理解したいです。

なぜConversionServiceFactoryBeanとJavaの設定で動作しないのですか? GenericConversionServiceとはなぜ同じですか?

+0

私はまだ何が働いていないのかはわかりません。そのリンクの関連部分をここにあなたの質問に抽出してください。あなたが言及している失敗を示す[mcve]を提示してください。 –

答えて

1

あなたはConversionServiceFactoryBean Beanが工場出荷時の豆を構築しながら、 すなわちafterPropertiesSetが既に呼び出されている初期化された後、あなたのconversionService方法でコンバータを登録しようとしているからです。あなたの質問に最初のメソッドを使用する場合は、afterPropertiesSetメソッドが呼び出される前にコンバーターを登録する必要があります。ですので、conversionServiceconversionServiceFactoryBeanメソッドを次のように変更します。しかしながら、これら2つのメソッドを分離

@Bean 
public ConversionService conversionService(ConversionServiceFactoryBean factory) { 
    return factory.getObject(); 
} 

@Bean 
public ConversionServiceFactoryBean conversionServiceFactoryBean(Set<Converter<?, ?>> converters) { 
    ConversionServiceFactoryBean factory = new ConversionServiceFactoryBean(); 
    factory.setConverters(converters); 
    return factory; 
} 

conversionServiceのインスタンスが既にSpringコンテキストに登録されていたとして何の目的を果たしていません。だから次のようにこれらの2つの方法をマージするほうがよい。

@Bean 
public ConversionServiceFactoryBean conversionService(Set<Converter<?, ?>> converters) { 
    ConversionServiceFactoryBean factory = new ConversionServiceFactoryBean(); 
    factory.setConverters(converters); 
    return factory; 
} 

上記で引用したspring xmlの例は、上記のように1つの方法でjava configに変換できます。

+0

最初に提案されたソリューションでは、 'ConversionService' @Bean'メソッドは役に立ちません。 'ConversionServiceFactoryBean'' @ Bean'は、すでにコンテキストに 'ConversionService'ビーンを暗黙的に置きます。 SpringはファクトリBeanで 'FactoryBean#getObject'自体を呼び出します。 –

+0

そして、あなたが2番目のソリューションを必要としないように修正するのは、Springが私たちのためにすべての作業を行うからです。 –

+0

@SotiriosDelimanolisコメントありがとうございます。私はそれに応じて答えを編集しました。 – Setu

関連する問題