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

CRI*_*ANZ 4 duration java-8 spring-boot

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

我试图使用Spring引导文档中定义的一点:

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

常规的长表示形式(除非@DurationUnit指定了a,否则使用毫秒作为默认单位)标准ISO-8601格式由java.util.Duration 值和单位耦合的可读性更高的格式(例如10s表示10秒)

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

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

在最新的Spring Boot 2版本中,为application.properties中的Duration属性设置正确值的最佳方法是哪一种?

Vol*_*ozo 25

Spring Boot 2.5.5 更新


我们可以将@Value注释与值一起使用application.properties。例如,您的application.properties文件中有下一个属性:

your.amazing.duration=100ms
Run Code Online (Sandbox Code Playgroud)

然后你可以在@Value注释中使用它:

your.amazing.duration=100ms
Run Code Online (Sandbox Code Playgroud)

就这些。


支持单位:

  • ns代表纳秒
  • us为微秒
  • ms代表毫秒
  • s代表秒
  • m代表分钟
  • h代表小时
  • d几天

文档:链接


小智 18

任何类型为 duration 的属性都可以通过.properties.yml文件注入。您需要做的就是使用正确的格式。

如果要注入5秒的持续时间应该被定义为PT5Spt5sPT5s

  • 字母的大小写无关紧要,因此您可以使用任何可读的组合
  • 通常每个人都使用大写字母

其他例子

PT1.5S       = 1.5 Seconds
PT60S        = 60 Seconds
PT3M         = 3 Minutes
PT2H         = 2 Hours
P3DT5H40M30S = 3Days, 5Hours, 40 Minutes and 30 Seconds
Run Code Online (Sandbox Code Playgroud)

您还可以使用 +ve 和 -ve 符号来表示正负时间段。

  • 您只能否定一个实体,例如:PT-3H30M= -3 小时,+30 分钟,基本上是 -2.5Hours
  • 或者你可以否定整个实体:-PT3H30M= -3 小时,-30 分钟,基本上是 -3.5Hours
  • 双重否定在这里也有效:-PT-3H+30M= +3 小时,-30 分钟,基本上是 +2.5 小时



Upvote,如果它适合你或者你喜欢这个解释。谢谢,

  • Spring Boot 还支持[“简单”持续时间格式](https://docs.spring.io/spring-boot/docs/2.1.12.RELEASE/reference/html/boot-features-external-config.html#boot-功能-外部-配置-转换-持续时间):“60s”,“5m”,“2h”。 (9认同)
  • 这对 Spring Boot 2.3.2.RELEASE w java 11 不起作用。获取 IllegalStateException“无法将类型 'java.lang.String' 的值转换为所需类型 'java.time.Duration':没有匹配的编辑器或转换策略找到”用法:@Value(“${foo.start.window:PT2H}”) private Duration fooStartWindow; (2认同)

Bro*_*her 8

当前的 Duration (Spring-Boot 2.0.4.RELEASE) 不能与 @Value 表示法一起使用,但可以与 @ConfigurationProperties 一起使用

对于 Redis,您有 RedisProperties 并且可以使用以下配置:

spring.redis.timeout=5s
Run Code Online (Sandbox Code Playgroud)

和:

@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());
  }
}
Run Code Online (Sandbox Code Playgroud)

它打印(解析为 5s):

PT5S
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

@Value("#{T(java.time.Duration).parse('${spring.redis.timeout}')}")
private Duration timeout;
Run Code Online (Sandbox Code Playgroud)

  • Spring Boot 现在直接支持 Duration(不使用 SEL)。在 Spring Boot 2.1.9.RELEASE 上测试。 (2认同)

小智 5

如果您的 Spring-Boot 版本或其依赖项未将 ApplicationConversionService 放入上下文中(Spring-Boot 直到 2.1 才这样做),您可以显式公开它

@Bean
public ConversionService conversionService() {
    return ApplicationConversionService.getSharedInstance();
}
Run Code Online (Sandbox Code Playgroud)

它调用Duration.parse,因此您可以在属性文件中使用PT3S、等。PT1H30M