一.简要说明
我们用springboot开发服务端时,必不可少的就是参数校验,比如参数不能为空,长度最大不能超过几,电话号码格式,邮箱格式等等。如果写一堆的if / else语句会显得特别繁琐,影响效率。所以介绍下@Validated,可以更加方便我们对参数的校验。
二.添加依赖
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.7.Final</version>
</dependency>
三.常用注解
介绍:
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式
@Email 被注释的元素必须是电子邮箱地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range 被注释的元素必须在合适的范围内
@NotBlank 验证字符串非null,且长度必须大于0
重要区别:
- @NotNull 适用于任何类型,被注解的元素必须不能为NULL
- @NotEmpty 适用于String、Map或者数组,不能为Null且长度必须大于0
- @NotBlank 只能用于String,不能为null,调用trim()后,长度必须大于0
四.使用(以注册为例)
dto层
下边对手机号,邮箱进行了判空和长度及格式校验
@Data
public class Register {
@NotNull(message = "手机号不能为空")
@NotBlank(message = "手机号不能为空")
@Pattern(regexp = "^((13[0-9])|(14[5-9])|(15([0-3]|[5-9]))|(16[6-7])|(17[1-8])|(18[0-9])|(19[1|5])|(19[6|8])|(199))\\d{8}$", message = "手机号格式有误")
@Size(min = 11, max = 11, message = "手机号码长度不正确")
private String phoneNumber;
@NotNull(message = "昵称不能为空")
@NotBlank(message = "昵称不能为空")
private String nickName;
@NotNull(message = "密码不能为空")
@NotBlank(message = "密码不能为空")
private String pwd;
@NotNull(message = "性别不能为空")
@NotBlank(message = "性别不能为空")
private String sex;
@NotNull(message = "邮箱不能为空")
@NotBlank(message = "邮箱不能为空")
@Email
private String email;
// 常用
@Size(min = 6, max = 16, message = "密码长度6-16")
@Range(min = 1, max = 9999) // 1-9999之间
@Digits(integer = 4, fraction = 0) // 4位整数,0位小数
}
当然,只在这里声明这些是没有用的,我们还需要在controller方法体添加@Validated不加@Validated校验会不起作用。
controller层
@PostMapping("/register")
@ResponseBody
public CommonResult register(@Validated @RequestBody Register register) {
...........
}
其实,到这里我们就完成了参数校验,我们来看看postman测试结果
我们可以发现,返回的参数并不理想,前端或者客户端不好处理,为了方便,我们添加一个全局的异常处理。
全局异常处理
创建一个GlobalExceptionHandler类,在类上方添加@RestControllerAdvice注解然后添加以下代码:
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public CommonResult handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
return new CommonResult(false,e.getBindingResult().getFieldError().getDefaultMessage());
}
}
然后我们再用postman进行测试: