24.8.4属性转换
Spring Boot在绑定到 @ConfigurationProperties beans时尝试将外部应用程序属性强制转换为正确的类型。如果您需要自定义类型转换,
则可以提供 ConversionService bean(bean名为 conversionService )或自定义属性编辑器(通过 CustomEditorConfigurer bean)或
自定义 Converters (bean定义注释为 @ConfigurationPropertiesBinding )。
由于在应用程序生命周期中很早就请求bean,因此请确保限制 ConversionService 正在使用的依赖项。通常,您在创建时可能无
法完全初始化所需的任何依赖项。如果配置密钥强制不需要,您可能需要重命名自定义 ConversionService ,并且只依赖于使
用 @ConfigurationPropertiesBinding 限定的自定义转换器。
转换持续时间
Spring Boot专门支持表达持续时间。如果公开 java.time.Duration 属性,则可以使用应用程序属性中的以下格式:
常规 long 表示(使用毫秒作为默认单位,除非指定了 @DurationUnit )
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 都是等效的。可以使用以下任何一种形式指定500ms的读取超时:500 , PT0.5S 和 500ms 。
您也可以使用任何支持的单位。这些是:
纳秒时间为 ns
us 微秒
ms 毫秒
s 秒
m 分钟
h 几个小时
d 几天
默认单位是毫秒,可以使用 @DurationUnit 覆盖,如上面的示例所示。
如果要从仅使用 Long 来表示持续时间的先前版本升级,请确保定义单位(使用 @DurationUnit ),如果它不是切换
到 Duration 旁边的毫秒。这样做可以提供透明的升级路径,同时支持更丰富的格式。
转换数据大小
Spring Framework有一个 DataSize 值类型,允许以字节为单位表示大小。如果公开 DataSize 属性,则可以使用应用程序属性中的以下格
式:
常规 long 表示(使用字节作为默认单位,除非指定了 @DataSizeUnit )
值和单元耦合的更易读的格式(例如 10MB 表示10兆字节)
请考虑以下示例:
@ConfigurationProperties("app.io")
public class AppIoProperties {
@DataSizeUnit(DataUnit.MEGABYTES)
private DataSize bufferSize = DataSize.ofMegabytes(2);
private DataSize sizeThreshold = DataSize.ofBytes(512);
public DataSize getBufferSize() {
return this.bufferSize;
}
public void setBufferSize(DataSize bufferSize) {
this.bufferSize = bufferSize;
}
public DataSize getSizeThreshold() {
return this.sizeThreshold;
}
public void setSizeThreshold(DataSize sizeThreshold) {
this.sizeThreshold = sizeThreshold;
}
}
要指定10兆字节的缓冲区大小, 10 和 10MB 是等效的。可以将大小阈值256字节指定为 256 或 256B 。
您也可以使用任何支持的单位。这些是:
B 表示字节
千字节 KB
MB 表示兆字节
GB 为千兆字节
TB 表示太字节
默认单位是字节,可以使用 @DataSizeUnit 覆盖,如上面的示例所示。
如果要从仅使用 Long 来表示大小的先前版本升级,请确保定义单位(使用 @DataSizeUnit ),如果它不是切换到 DataSize 旁
边的字节。这样做可以提供透明的升级路径,同时支持更丰富的格式。
24.8.5 @ConfigurationProperties验证
Spring Boot尝试使用Spring @Validated 注释注释 @ConfigurationProperties 类。您可以直接在配置类上使用JSR-303
javax.validation 约束注释。为此,请确保符合条件的JSR-303实现位于类路径上,然后将约束注释添加到字段中,如以下示例所示:
@ConfigurationProperties(prefix="acme")
@Validated
public class AcmeProperties {
@NotNull
private InetAddress remoteAddress;
// ... getters and setters
}
您还可以通过使用 @Validated 注释创建配置属性的 @Bean 方法来触发验证
虽然嵌套属性也会在绑定时进行验证,但最好还是将关联字段注释为 @Valid 。这可确保即使未找到嵌套属性也会触发验证。以下示例基于前面
的 AcmeProperties 示例构建:
@ConfigurationProperties(prefix="acme")
@Validated
public class AcmeProperties {
@NotNull
private InetAddress remoteAddress;
@Valid
private final Security security = new Security();
// ... getters and setters
public static class Security {
@NotEmpty
public String username;
// ... getters and setters
}
}
您还可以通过创建名为 configurationPropertiesValidator 的bean定义来添加自定义Spring Validator 。应该声明 @Bean 方法 static 。
配置属性验证器是在应用程序生命周期的早期创建的,并且将 @Bean 方法声明为静态可以创建bean而无需实例化 @Configuration 类。这样做
可以避免早期实例化可能导致的任何问题。有一个 属性验证示例,显示如何设置。
spring-boot-actuator 模块包含一个暴露所有 @ConfigurationProperties beans的端点。将Web浏览器指
向 /actuator/configprops 或使用等效的JMX端点。有关详细信息,请参阅“ 生产就绪功能 ”部分。