计量单位及数据校验解读

2023-10-15 11:16:22 浏览数 (1)

计量单位

假设我们书写了如下配置值,其中第三项超时时间timeout描述了服务器操作超时时间,当前值是-1表示永不超时。

代码语言:javascript复制
servers:
  ip-address: 192.168.0.1 
  port: 2345
  timeout: -1

当我们把这个timeout设为240的时候每个人都这个值的理解会产生不同,比如线上服务器完成一次主从备份,配置超时时间240,这个240如果单位是秒就是超时时间4分钟,如果单位是分钟就是超时时间4小时。

springboot充分利用了JDK8中提供的全新的用来表示计量单位的新数据类型,从根本上解决这个问题。以下模型类中添加了两个JDK8中新增的类,分别是Duration和DataSize

代码语言:javascript复制
@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
    @DurationUnit(ChronoUnit.HOURS)
    private Duration serverTimeOut;
    @DataSizeUnit(DataUnit.MEGABYTES)
    private DataSize dataSize;
}

Duration:表示时间间隔,可以通过@DurationUnit注解描述时间单位,例如上例中描述的单位为小时(ChronoUnit.HOURS)

ChronoUnit可以选择以下常量:

  • DAYS(天)
  • WEEKS(周)
  • MONTHS(月)
  • YEARS(年)
  • DECADES(十年)
  • CENTURIES(世纪)
  • MILLENNIA(千年)
  • NANOS(纳秒)
  • MICROS(微秒)
  • MILLIS(毫秒)
  • SECONDS(秒)
  • MINUTES(分钟)
  • HOURS(小时)

DataSize:表示存储空间,可以通过@DataSizeUnit注解描述存储空间单位,例如上例中描述的单位为MB(DataUnit.MEGABYTES)

@DataSizeUnit提供了以下数据大小单位可供选择:

  • BYTES
  • KILOBYTES
  • MEGABYTES
  • GIGABYTES
  • TERABYTES

还有一种用法是直接在配置文件中写上你想要对应的单位,如下:

代码语言:javascript复制
servers:
  ip-address: 192.168.0.1
  port: 2345
  dataSize: 2B
代码语言:javascript复制
@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
    private String ipAddress;
    private int port;
    private DataSize dataSize;
}
代码语言:javascript复制
servers:
  ip-address: 192.168.0.1
  port: 2345
  dataSize: 2MB

 如果也采用了注解跟配置文件中写单位,则以配置文件中的单位为准

 数据校验

SpringBoot给出了强大的数据校验功能,可以有效的避免此类问题的发生。在JAVAEE的JSR303规范中给出了具体的数据校验标准,开发者可以根据自己的需要选择对应的校验框架,此处使用Hibernate提供的校验框架来作为实现进行数据校验。

JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate Validator。 Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。

步骤①:开启校验框架

代码语言:javascript复制
<!--1.导入JSR303规范-->
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
</dependency>
<!--使用hibernate框架提供的校验器做实现-->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>

步骤②:在需要开启校验功能的类上使用注解@Validated开启校验功能

代码语言:javascript复制
@Component
@Data
@ConfigurationProperties(prefix = "servers")
//开启对当前bean的属性注入校验
@Validated
public class ServerConfig {
}

步骤③:对具体的字段设置校验规则

代码语言:javascript复制
@Component
@Data
@ConfigurationProperties(prefix = "servers")
//开启对当前bean的属性注入校验
@Validated
public class ServerConfig {
    //设置具体的规则
    @Max(value = 8888,message = "最大值不能超过8888")
    @Min(value = 202,message = "最小值不能低于202")
    private int port;
}

常见注解说明

约束注解名称

约束注解说明

@Null

用于验证对象为null

@NotNull

用于对象不能为null,无法查检长度为0的字符串

@NotBlank

只用于String类型上,不能为null且trim()之后的size>0

@NotEmpty

用于集合类、String类不能为null,且size>0。但是带有空格的字符串校验不出来

@Size

用于对象(Array,Collection,Map,String)长度是否在给定的范围之内

@Length

用于String对象的大小必须在指定的范围内

@Pattern

用于String对象是否符合正则表达式的规则

@Email

用于String对象是否符合邮箱格式

@Min

用于Number和String对象是否大等于指定的值

@Max

用于Number和String对象是否小等于指定的值

@AssertTrue

用于Boolean对象是否为true

@AssertFalse

用于Boolean对象是否为false

0 人点赞