web-dev-qa-db-ja.com

Spring boot 2 Converting Duration Java 8 application.properties

Application-propertiesでDuration value (spring.redis.timeout)を定義する必要があります。

Spring boot documentationで定義されている1つのポイントを使用しようとしました:

スプリングブートは期間を表現するための専用サポートを持っていますJava.time.Durationプロパティを公開する場合、アプリケーションプロパティで次の形式を使用できます。

通常の長い表現(@DurationUnitが指定されていない限り、デフォルトの単位としてミリ秒を使用)Java.util.Durationで使用される標準ISO-8601形式10秒を意味します)

Spring.redis.timeout = 3sを使用すると、Springブートアプリケーションが次の例外をスローします。

タイプ 'Java.lang.String'の値を必要なタイプ 'Java.time.Duration'に変換できません:一致するエディターまたは変換戦略が見つかりません

Spring Boot 2の最後のリリースでapplication.propertiesのDurationプロパティに正しい値を設定する最良の方法はどれですか?

Spring Expression Languageで@Value表記を使用することは可能です

@Value("#{T(Java.time.Duration).parse('${spring.redis.timeout}')}")
private Duration timeout;
5
Serge

現時点の期間(Spring-Boot 2.0.4.RELEASE)@Value表記と一緒に使用することはできませんが、@ ConfigurationPropertiesと共に使用することは可能です。

Redisには、RedisPropertiesがあり、構成を使用できます。

spring.redis.timeout=5s

そして:

@SpringBootApplication
public class DemoApplication {

  @Autowired
  RedisProperties redisProperties;

  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }

  @PostConstruct
  void init() {
    System.out.println(redisProperties.getTimeout());
  }
}

印刷されました(5として解析):

PT5S

https://docs.Oracle.com/javase/8/docs/api//Java/time/Duration.html#parse-Java.lang.CharSequence-

4
Brother

Spring Bootは、@ ConfigurationProperties Beanにバインドするときに、外部アプリケーションプロパティを正しいタイプに強制しようとします。カスタムタイプの変換が必要な場合は、ConversionService Bean(conversionServiceという名前のBean)を提供できます。

参照: https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/htmlsingle/#boot-features-external-config-conversion

新しいApplicationConversionService Beanを作成します(この名前はconversionServiceでなければなりません)。ここに、Spring boot 2.0.4でテストされた私のコードがあります:

@Configuration
public class Conversion {

@Bean
public ApplicationConversionService conversionService()
{
    final ApplicationConversionService applicationConversionService = new ApplicationConversionService();
    return applicationConversionService;
}

以下に、このアプローチを使用したサンプルプロジェクトを示します。

https://github.com/cristianprofile/spring-data-redis-lettuce

Spring-Bootバージョンまたはその依存関係がApplicationConversionServiceをコンテキストに入れない場合(およびSpring-Bootは2.1になるまで)、明示的に公開できます。

@Bean
public ConversionService conversionService() {
    return ApplicationConversionService.getSharedInstance();
}

Duration.parseを呼び出すため、プロパティファイルでPT3SPT1H30Mなどを使用できます。

0
Max