首页 > 其他 > 详细

配置属性值数据绑定校验

时间:2020-11-14 22:47:21      阅读:31      评论:0      收藏:0      [点我收藏+]

一、为什么要对配置属性值校验

我们都知道配置文件是需要开发人员手动来修改的,只要是人为参与就会有出错的可能。为了避免人为配置出错的可能,我们需要对配置属性值做校验。

比如:

  • 针对数据库密码配置:需要限定最小长度或者复杂度限制
  • 针对系统对外发邮件,邮件发送方的邮箱地址配置:字符串配置要符合一定的邮件正则表达式规则
  • 针对某些不能为空的配置:开发人员有可能忘了为它赋值,等等场景

我们不能等到程序上线之后,才发现相关的配置错误。所以我们通常对配置属性与类对象的成员变量绑定的时候,就加上一些校验规则。如果配置值不符合校验规则,在应用程序在启动的时候就会抛出异常。

二、如何对绑定的属性值进行校验

比如:我们希望对之前章节定义的family类里面爸爸的年龄,进行校验。让其不能小于21岁,小于21就是不合理的配置,也就是错误配置。那我们该怎么做呢?

在需要校验的属性装配类上加@Validated注解

@Data
@Component  // 必须加入容器内才能读取配置文件信息
@ConfigurationProperties(prefix = "family") //接收yml配置的java实体类,表示配置的整体前缀
@Validated
public class Family {
  • 校验父亲的年龄,必须大于23岁
public class Father {
    private String name;
    @Min(23) //最小为23岁
    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包。
技术分享图片

<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的这样一个校验规则。

技术分享图片

校验失败,会有如下异常。

技术分享图片

三、其他参考例子:

  • @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规范(国外网址,国内访问比较慢,需要耐心等)

限制 说明
@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格式

配置属性值数据绑定校验

原文:https://www.cnblogs.com/jinyuanya/p/13974401.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!