24.7.3. Properties Conversion
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秒,30
, PT30S
和 30s
都是等价的。将读取超时指定为500毫秒,可以用下列格式里的任何一种:500
, PT0.5S
与500ms
。
你也可以使用任何支持的单位:
- ns用于纳秒
- ms用于毫秒
- s用于秒
- m用于分
- h用于小时
- d应用日
默认单位是毫秒,可以使用@DefaultUnit
重写。
注 如果你正在升级之前的版本,之前的版本简单地使用Long
来表达时间段,如果切换到Duration
时不是毫秒,要确保定义了单位(使用@DefaultUnit
)。这样做的话,在支持更加丰富的格式的同时,升级也能更加透明。