我们都知道配置文件是需要开发人员手动来修改的,只要是人为参与就会有出错的可能。为了避免人为配置出错的可能,我们需要对配置属性值做校验。
比如:
我们不能等到程序上线之后,才发现相关的配置错误。所以我们通常对配置属性与类对象的成员变量绑定的时候,就加上一些校验规则。如果配置值不符合校验规则,在应用程序在启动的时候就会抛出异常。
比如:我们希望对之前章节定义的family类里面爸爸的年龄,进行校验。让其不能小于21岁,小于21就是不合理的配置,也就是错误配置。那我们该怎么做呢?
在需要校验的属性装配类上加@Validated注解
@Data
@Component // 必须加入容器内才能读取配置文件信息
@ConfigurationProperties(prefix = "family") //接收yml配置的java实体类,表示配置的整体前缀
@Validated
public class Family {
public class Father {
private String name;
@Min(23) //最小为23岁
private Integer age;
}
@NotEmpty
private String familyName;
这些校验规则注解是在JSR 303(java)规范中定义的,但是JSR 303只是一个规范,并没有很多比较具体的实现。目前通常都是使用hibernate-validator进行统一参数校验,hibernate-validator是对JSR 303规范的实现。
所以当你使用注解的时候,如果org.hibernate.validator.constraints包和javax.validation.constraints包同时存在某个校验注解,要import使用org.hibernate.validator.constraints包。
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.18.Final</version>
</dependency>
在之前的Spring Boot 版本中,hibernate-validator是作为默认引入的web开发的集成package,但是在我最新使用的Spring Boot 2.3.0.RELEASE已经不是默认引入的了,所以需要通过上面的maven坐标单独引入。
针对Family的属性校验,只需要写一个测试类,将Family类注入就可以。
@ExtendWith(SpringExtension.class) //Junit5
@SpringBootTest
public class CustomYamlTest {
@Resource
Family family;
@Test
public void hello(){
System.out.println(family.toString());
}
}
如果我们修改family.father.age=18,也就是说不满足最小值是21的这样一个校验规则。
校验失败,会有如下异常。
实际上这些校验注解不仅可以校验配置属性值,也可以校验HTTP请求参数值,我们后面的章节会为大家再次介绍。
官方JSR 303规范(国外网址,国内访问比较慢,需要耐心等)
限制 | 说明 |
---|---|
@Null | 限制只能为null |
@NotNull | 限制必须不为null |
@AssertFalse | 限制必须为false |
@AssertTrue | 限制必须为true |
@DecimalMax(value) | 限制必须为一个不大于指定值的数字 |
@DecimalMin(value) | 限制必须为一个不小于指定值的数字 |
@Digits(integer,fraction) | 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction |
@Future | 限制必须是一个将来的日期 |
@Max(value) | 限制必须为一个不大于指定值的数字 |
@Min(value) | 限制必须为一个不小于指定值的数字 |
@Past | 限制必须是一个过去的日期 |
@Pattern(value) | 限制必须符合指定的正则表达式 |
@Size(max,min) | 限制字符长度必须在min到max之间 |
@Past | 验证注解的元素值(日期类型)比当前时间早 |
@NotEmpty | 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) |
@NotBlank | 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格 |
验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式 |
原文:https://www.cnblogs.com/jinyuanya/p/13974401.html