Please enable Javascript to view the contents

java Duration 类型转换错误

 ·  ☕ 2 分钟

由于我在 springboot2.0 的 application-dev.yml 中通过如下方式 设置了 session 失效时间 :

    session:
      timeout: 43200‬

启动时发生如下错误:

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to bind properties under 'server.servlet.session.timeout' to java.time.Duration:

    Property: server.servlet.session.timeout
    Value: 43200‬
    Origin: class path resource [application-dev.yml]:9:16
    Reason: failed to convert java.lang.String to @org.springframework.boot.convert.DurationUnit java.time.Duration

Action:

Update your application's configuration

这是一个格式转换错误。

我们先来了解一下 Duration 这个类:

Duration 对象表示两个 Instant 间的一段时间。它是 java 8 中引入的两个与日期相关的新类:Period 和 Duration,中的一个。

两者之间的差异为:

  • Period 基于日期值,
  • Duration 基于时间值。

另外还有一个 Instant 表示某一瞬间的时间值,时间戳,时刻。

Duration 表示持续时间,两个时刻之间的时间跨度。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import java.time.Duration;

public class Main {
  public static void main(String[] args) {

    Duration d1  = Duration.ofDays(2);
    System.out.println(d1);

    Duration d2  = Duration.ofMinutes(2);
    System.out.println(d2);

  }
}

输出结果为:

PT48H
PT2M

而 Spring Boot 2 并没有使用 Duration.ofSeconds(200) 这样的方式去解析我们的配置中值。

根据错误提示它应该使用的是 org.springframework.boot.convert.DurationUnit 这个类。

我们可以使用遵循 ISO-8601 持续时间标准格式的字符串,来表示一个持续时间。

ISO 8601 持续时间格式,示例:

P3Y6M4DT12H30M5S

其中

  • P :是持续时间指示符,始终放在开头,是必要字符,不能省略
  • 3Y6M4D :表示 三年,六个月,四天
  • T :表示后面跟的是时间。如果存在时间则必须要有 T
  • 12H30M5S : 十二小时,三十分钟和五秒

其他示例:

  • PT48H : 一小时 (表示时间,P 和 T 都不能省略)
  • P5D : 五天(可以省略 T)

最后更改我们的配置为:

1
2
3
4
5
server:
  port: 80
  servlet:
    session:
      timeout: PT20M

参考:

您的鼓励是我最大的动力
alipay QR Code

Felix
作者
Felix
如无必要,勿增实体。

3

目录