多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 一、为什么要对配置属性值校验 我们都知道配置文件是需要开发人员手动来修改的,只要是人为参与就会有出错的可能。为了避免人为配置出错的可能,我们需要对配置属性值做校验。 比如: * 针对数据库密码配置:需要限定最小长度或者复杂度限制 * 针对系统对外发邮件,邮件发送方的邮箱地址配置:字符串配置要符合一定的邮件正则表达式规则 * 针对某些不能为空的配置:开发人员有可能忘了为它赋值,等等场景 我们不能等到程序上线之后,才发现相关的配置错误。所以我们**通常对配置属性与类对象的成员变量绑定的时候,就加上一些校验规则。如果配置值不符合校验规则,在应用程序在启动的时候就会抛出异常。** ## 二、如何对绑定的属性值进行校验 比如:我们希望对之前章节定义的family类里面爸爸的年龄,进行校验。让其不能小于21岁,小于21就是不合理的配置,也就是错误配置。那我们该怎么做呢? **在需要校验的属性装配类上加@Validated注解** ~~~ @Data @Component @Validated @ConfigurationProperties(prefix = "family") public class Family { ~~~ * 校验父亲的年龄,必须大于21岁 ~~~ public class Father { private String name; @Min(21) private Integer age; } ~~~ * 校验familyName,必须不能为空 ~~~ @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包。 > ![](https://img.kancloud.cn/e3/1a/e31a4a8053cf3f7a93fa8616b2bdddb4_1140x79.png) ~~~ <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.2.4.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的这样一个校验规则。 ![](https://img.kancloud.cn/17/dc/17dc98b93f3e0574a1cff7a13b8c454f_451x161.png) 校验失败,会有如下异常。 ![](https://img.kancloud.cn/42/f4/42f4bbae69941ec53a87f86fc9bc8c26_1397x241.png) ## 三、其他参考例子: * @size (min=6, max=20, message="密码长度只能在6-20之间") * @pattern (regexp="\[a-za-z0-9.\_%+-\]+@\[a-za-z0-9.-\]+\\.\[a-za-z\]{2,4}", message="请输入正确的邮件格式") * @Length(min = 5, max = 20, message = "用户名长度必须位于5到20之间") * @Email(message = "请输入正确的邮箱") * @NotNull(message = "用户名称不能为空") * @Max(value = 100, message = "年龄不能大于100岁") * @Min(value= 18 ,message= "必须年满18岁!" ) * @AssertTrue(message = "bln4 must is true") * @AssertFalse(message = "blnf must is falase") * @DecimalMax(value="100",message="decim最大值是100") * @DecimalMin(value="100",message="decim最小值是100") * @NotNull(message = "身份证不能为空") * @Pattern(regexp="^(\\d{18,18}|\\d{15,15}|(\\d{17,17}\[x|X\]))$", message="身份证格式错误") ## 附录、常用校验注解 实际上这些校验注解不仅可以校验配置属性值,也可以校验HTTP请求参数值,我们后面的章节会为大家再次介绍。 [官方JSR 303规范(国外网址,国内访问比较慢,需要耐心等)](https://beanvalidation.org/1.0/spec/) | 限制 | 说明 | | --- | --- | | @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 | 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式 |