入参参数校验

        

在日常的接口开发中,为了防止非法参数对业务造成影响,经常需要对接口的参数做
校验,例如登录的时候需要校验用户名密码是否为空,创建用户的时候需要校验邮件、
手机号码格式是否准确。靠代码对接口参数一个个校验的话就太繁琐了,代码可读性
极差。本后端开发框架基于 Spring Boot 引入 Validator 参数校验器,以优雅的方式来
解决入参校验问题。
Validator 框架就是为了解决开发人员在开发的时候少写代码,提升开发效率;
Validator 专门用来进行接口参数校验,例如常见的必填校验,email 格式校验,用户
名必须位于 6 到 12 之间等等
Validator 校验框架遵循 JSR-303 验证规范(参数校验规范), JSR 是 Java Specification
Requests 的缩写。
参数校验越严格越好,严格的校验规则不仅能减少接口出错的概率,同时还能避免出
现脏数据,从而来保证系统的安全性和稳定性。
这里产品开发人员可能对框架会有一个疑问,为什么框架默认生成的 Model 类(DO)没
有根据数据库字段的定义添加校验规则,这样框架默认提供的 insert/update 之类的方
法就可以实现入参校验。其实框架不添加是基于以下两个原因考虑的,一个是 Model
类(DO)一般不建议直接作为服务入参使用(框架封装内置服务除外),一般对外服务的
入参建议自定义 DTO 再进行入参校验比较合适;一个是 Model 类(DO)在框架层面也
是查询入参 Param 的基类,它也可以作为查询参数的字段,而查询的条件是动态组装
且不受数据库字段定义约束的,此时做入参校验将导致冲突。
1. 引入依赖
从 springboot-2.3 开始,校验包被独立成了一个 starter 组件,所以需要引入
validation该依赖,如下图所示:

         

2. 校验参数
案例一:对 DTO 实体类进行校验
第一步,DTO 添加校验注解
入参参数校验_第1张图片
第二步,验证请求体
验证请求体即被@RequestBody 注解标记的方法参数。我们在需要验证的参数上加
上了@Valid 注解,如果验证失败,它将抛出 MethodArgumentNotValidException。
默认情况下,Spring 会将此异常转换为 HTTP Status 400(错误请求)。

案例二:对单个参数进行校验

         

当然还有其他高级的校验方式,这里就只举例子不进行 Demo 代码提供,例如分组
校验场景:在新增时我们需要 id 为空,但修改时我们又需要 id 不为空,总不可能
搞两个校验类,这时候分组校验的用处就来了。还可以自定义分组校验,场景:当
type 为 1 时,需要参数 a 不为空,当 type 为 2 时,需要参数 b 不为空。当然也支
持嵌套校验,当某个对象中还包含其他对象需要进行校验等场景。
3. 注解说明
常用校验注解总结,JSR303 定义了 Bean Validation(校验)的标准 validation-api,
并没有提供实现。Hibernate Validation 是对这个规范的实现,并且增加了@Email、
@Length 、 @Range 等 注 解 。 Spring Validation 底 层 依 赖 的 就 是 Hibernate
Validation。
JSR 提供的校验注解:
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最
大值
@Size(max=, min=) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范
围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
Hibernate Validator 提供的校验注解:
@NotBlank(message =) 验证字符串非 null,且长度必须大于 0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
启用校验:
@Validated 放在类或方法上
@Valid 放在参数上
4. 自定义 Validator
虽然官方提供的校验注解已经满足很多情况,但还是无法满足我们业务的所有需求。
如果自带的校验注解无法满足需求的,还可以自定义实现注解。
案例一:校验特定字段的值是否在可选范围
比如这样一个需求:DTO 有一个 Region 字段,Region 字段只能是 China、China
Taiwan、China-HongKong 这三个中的一个。
第一步,需要创建一个注解 Region
入参参数校验_第2张图片

第二步,需要实现 ConstraintValidator 接口,并重写 isValid 方法

入参参数校验_第3张图片 

 

第三部,使用这个注解

 

案例二:校验电话号码
校验我们的电话号码是否合法,这个可以通过正则表达式来做,甚至可以设置针对
特定运营商电话号码段的正则表达式。
第一步,需要创建一个注解 PhoneNumber
入参参数校验_第4张图片

第二步,需要实现 ConstraintValidator 接口,并重写 isValid 方法

入参参数校验_第5张图片 

第三部,使用这个注解

 

 

 

 

你可能感兴趣的:(java,mysql,开发语言)