Spring boot 2转换持续时间java 8 application.properties

问题描述 投票:2回答:3

我需要通过application.properties定义Duration值(spring.redis.timeout)。

我试图使用Spring启动文档中定义的一个点:

Spring Boot专门支持表达持续时间。如果公开java.time.Duration属性,则可以使用应用程序属性中的以下格式:

常规长表示(使用毫秒作为默认单位,除非指定了@DurationUnitjava.util.Duration使用的标准ISO-8601格式更可读的格式,其中值和单位耦合(例如10s表示10秒)

当我使用spring.redis.timeout = 3s时Spring启动应用程序抛出此异常:

无法将'java.lang.String'类型的值转换为必需类型'java.time.Duration':找不到匹配的编辑器或转换策略

哪个是在application.properties中使用最后一个Spring boot 2版本为Duration属性设置正确值的最佳方法?

spring-boot java-8 duration
3个回答
4
投票

当前的持续时间(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());
  }
}

它打印(解析为5s):

PT5S

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


2
投票

当Spring绑定到@ConfigurationProperties bean时,Spring Boot会尝试将外部应用程序属性强制转换为正确的类型。如果需要自定义类型转换,可以提供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


1
投票

可以在Spring Expression Language中使用@Value表示法

@Value("#{T(java.time.Duration).parse('${spring.redis.timeout}')}")
private Duration timeout;
© www.soinside.com 2019 - 2024. All rights reserved.