web-dev-qa-db-ja.com

SpringBootにカスタムコンバーターを登録する方法は?

Spring-boot-starter-jdbc(v1.3.0)を使用してアプリケーションを作成しています。

私が遭遇した問題:BeanPropertyRowMapperのインスタンスはJava.sql.TimestampからJava.time.LocalDateTimeに変換できないため、失敗します。

この問題をコピーするために、これらのタイプにorg.springframework.core.convert.converter.Converterを実装しました。

public class TimeStampToLocalDateTimeConverter implements Converter<Timestamp, LocalDateTime> {

    @Override
    public LocalDateTime convert(Timestamp s) {
        return s.toLocalDateTime();
    }
}

私の質問は、どうすればTimeStampToLocalDateTimeConverterBeanPropertyRowMapperで利用できるようにするのですか。

より一般的な質問ですが、コンバーターをシステム全体で利用できるようにするには、コンバーターを登録するにはどうすればよいですか?

次のコードは、初期化段階でNullPointerExceptionに移動します。

private Set<Converter> getConverters() {
    Set<Converter> converters = new HashSet<Converter>();
    converters.add(new TimeStampToLocalDateTimeConverter());
    converters.add(new LocalDateTimeToTimestampConverter());

    return converters;
}

@Bean(name="conversionService")
public ConversionService getConversionService() {
    ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean();
    bean.setConverters(getConverters()); 
    bean.afterPropertiesSet();
    return bean.getObject();
}    

ありがとうございました。

14
user2900180

すべてのカスタム変換サービスは、FormatterRegistryに登録する必要があります。 WebMvcConfigurerを実装して、新しい構成を作成し、変換サービスを登録してみてください

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addallFormatters(FormatterRegistry registry) {
        registry.addConverter(new TimeStampToLocalDateTimeConverter());
    }
}

これがうまくいくことを願っています。

1

_org.springframework.web.servlet.config.annotation.WebMvcConfigurer_またはその実装のいずれかは、SpringBootプロジェクトでのあらゆる種類のカスタマイズの1つの停止場所です。コンバーターの要件に応じて、さまざまな方法が不要になります。

_org.springframework.core.convert.converter.Converter<S, T>_を拡張して、新しいコンバーターを作成するだけです。次に、クラスオーバーライドメソッドorg.springframework.web.servlet.config.annotation.WebMvcConfigurer.addFormatters(FormatterRegistry)を使用してSpringに登録します。

基本的にConditionalConverterから始まる他のタイプのコンバーターもあることに注意してください。

0
SauriBabu

アプリケーション全体で単一のConversionServiceインスタンスを使用するには、@ Autowiredおよび関連するSpringの依存性注入メカニズムを使用することをお勧めします。 ConversionServiceは構成内でインスタンス化されます。

アプリケーション全体で利用できるすべてのコンバーターは、アノテーション(@AutoRegisteredなど)を受け取ります。アプリケーションの起動時に、@ Component FormatterRegistrar(タイプ名自体は少し誤解を招く可能性があります。登録を行うので「... Registrar」です。完全にSpring管理されており、依存性注入が必要なため、@ Component)は@AutoRegisteredListを受け取ります。すべての注釈付きコンバーターの。

具体的な実装の詳細 については、このスレッドを参照してください。私たちはプロジェクト内でこのメカニズムを使用しており、魅力的に機能します。

0
s10z