SpringBoot的参数校验器-Validator
1、分析
在日常的开发中,服务端对象的校验是非常重要的一个环节,
比如注册的时候:校验用户名,密码,身份证,邮箱等信息是否为空,以及格式是否正确,
但是这种在日常的开发中进行校验太繁琐了,代码繁琐而且很多。
Validator框架应运而生,它的出现就是为了减少开发人员在开发时的代码,提升开发效率。它有专门用来做接口的参数校验,比如:密码长度、是否为空等。
Spring的validator校验框架遵守的是JSR-303的验证规范(参数校验规范),JSP全称:Java Specification Requests缩写。
在默认情况下:SpringBoot会引入hibernate validation机制来支持JSR-303验证规范。
SpringBoot的validator校验框架支持如下特征:
- JSR303特征:JSR303是一项标准,只提供规范不提供实现。规定一些校验规范即校验注解。比如:@Null、@NotNull、@Pattern。这些类都位于javax.validation.constraints`包下。
- hibernate validation特征:hibernate validation是对JSR303规范的实现并且进行了增强和扩展。并增加了注解:@Email、@Length、@Range等等。
- Spring Validation:Spring Validation是对Hibernate Validation的二次封装。在SpringMvc模块中添加了自动校验器。并将校验信息封装到特定的类中。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d6Dwx5sj-1626944793901)(C:\Users\长颈鹿\Pictures\springboot\Vaidator\Vaidator1.png)]
小结
-
验证数据的合法性是开发中非常重要的一个环节
-
保存数据的合法性的一种手段
常见注解
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,且trim后长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
2、Spring整合validator
核心步骤概述
-
在需要校验的bean(entity)中的属性上增加对应注解
-
在SpringMvc的方法参数中的entity中加==@Validated==的注解即可。
-
使用全局统一异常处理捕获的验证失败的提示信息
具体实现步骤
在pom.xml添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
新建用户实体并结合验证注解
package com.example.vo;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.*;
import java.util.Date;
/**
* @Auther: 长颈鹿
* @Date: 2021/07/22/15:15
* @Description:
*/
@Data
public class UserVo {
@NotNull(message = "用户id不能为空")
private Long userId;
@NotBlank(message = "用户名不能为空")
@Length(max = 20, message = "用户名不能超过20个字符")
@Pattern(regexp = "^[\\u4E00-\\u9FA5A-Za-z0-9\\*]*$", message = "用户昵称限制:最多20字符,包含文字、字母和数字")
private String username;
@NotBlank(message = "手机号不能为空")
@Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式有误")
private String mobile;
@NotBlank(message = "联系邮箱不能为空")
@Email(message = "邮箱格式不对")
private String email;
@Future(message = "时间必须是将来时间")
private Date createTime;
}
添加UserValidationController进行校验
package com.example.controller;
import com.example.vo.UserVo;
import io.swagger.annotations.Api;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.spri