24.7.3. 属性转换

将外部应用配置绑定到@ConfigurationProperties beans时,Spring Boot会尝试将属性强制转换为正确的类型。如果需要自定义类型转换器,你可以提供一个ConversionService bean(名为conversionService的bean),或自定义属性编辑器(通过CustomEditorConfigurer bean),或自定义Converters(bean定义时需要注解@ConfigurationPropertiesBinding)。

由于该bean在应用程序生命周期的早期就需要使用,所以确保限制你的ConversionService使用的依赖。通常,在创建时期任何你需要的依赖可能都没完全初始化。如果强制配置关键字不需要它,而且只依赖满足@ConfigurationPropertiesBinding的自定义的转换器,你可能想要重命名自定义的ConversionService

时间段转换

Spring Boot对表达时间段有专门的支持。 如果你暴露了java.time.Duration属性,可用下列格式的应用属性:

  • 常规的 long表示(默认单位为毫秒,除非指定了@DefaultUnit

  • java.util.Duration使用的标准的ISO-8601格式

  • 组合了值与单位的更加易读的格式(比如10s表示10秒)

考虑下面的例子:

@ConfigurationProperties("app.system")
public class AppSystemProperties {

    @DurationUnit(ChronoUnit.SECONDS)
    private Duration sessionTimeout = Duration.ofSeconds(30);

    private Duration readTimeout = Duration.ofMillis(1000);

    public Duration getSessionTimeout() {
        return this.sessionTimeout;
    }

    public void setSessionTimeout(Duration sessionTimeout) {
        this.sessionTimeout = sessionTimeout;
    }

    public Duration getReadTimeout() {
        return this.readTimeout;
    }

    public void setReadTimeout(Duration readTimeout) {
        this.readTimeout = readTimeout;
    }

}

为了将会话超时指定为30秒,30PT30S30s都是等价的。将读取超时指定为500毫秒,可以用下列格式里的任何一种:500PT0.5S500ms

你也可以使用任何支持的单位:

  • ns用于纳秒

  • ms用于毫秒

  • s用于秒

  • m用于分

  • h用于小时

  • d应用日

默认单位是毫秒,可以使用@DefaultUnit重写。

如果你正在升级之前的版本,之前的版本简单地使用Long来表达时间段,如果切换到Duration时不是毫秒,要确保定义了单位(使用@DefaultUnit)。这样做的话,在支持更加丰富的格式的同时,升级也能更加透明。

最后更新于