首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >微服务架构之Spring Boot(二十八)

微服务架构之Spring Boot(二十八)

作者头像
用户1289394
发布2022-04-07 19:59:32
发布2022-04-07 19:59:32
7920
举报
文章被收录于专栏:Java学习网Java学习网

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端点。有关详细信息,请参阅“ 生产就绪功能 ”部分。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习网 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档