springboot-请求入参验证
Spring Boot 支持 JSR-303 、 Bean 验证框架 , 默认实现用的是 Hibernate validator。在Spring MVC 中,只需要使用@Valid 注解标注在方法参数上, Spring Boot 即可对参数对象进行校验 ,校验结果放在BindingResult 对象中。
1. JSR-303验证规则
JSR-303 是 Java 标准的验证框架 , 己有的实现有 Hibernate validator . JSR-303 定义了一系列注解用来验证 Bean 的属性,常用的有如下几种。
空检查
- @Null , 验证对象是否为空 ;
- @NotNull , 验证对象不为空 ;
- @NotBlank , 验证字符串不为空或者不是空字符串, 比如””和””都会验证失败;
- @NotEmpty,验证对象不为null ,或者集合不为空;
长度检查
- @Size(min=, max=),验证对象长度,可支持字符串、集合;
- @Length , 字符串大小;
数值检测
- @Min ,验证数字是否大于等于指定的值;
- @Max ,验证数字是否小于等于指定的值;
- @Digits , 验证数字是否符合指定格式,如@Digits(integer=9,台action=2);
- @Range , 验证数字是否在指定的范围内,如@Range(min=1,max=100);
其他
- @Email , 验证是否为邮件格式,为 null 则不做校验;
- @Pattern, 验证 String 对象是否符合正则表达式的规则。
以下是一个包含了验证注解的 JavaBean:
import lombok.Data;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import javax.validation.constraints.Size;
/**
* @Author ccl
* @Date 2021/1/3 14:55
*/
@Data
public class User {
@Null(groups = {
Update.class},message = "id必须为空")//更新的时候必须为null
@NotNull(groups = {
Add.class},message = "id不能为空")//新增的时候必须不为null
private Long id;
@Size(min = 3, max = 20,message = "name长度必须在3到20之间")
private String name;
@Email(message = "email地址不合法")
private String email;
//定义一个group接口,更新时校验纽
public interface Update {
}
//定义另一个group接口,添加时校验纽
public interface Add {
}
}
通常,不同的业务逻辑会有不同的验证逻辑,比如对于 User来说,当更新的时候,id 必须不为 null ,但增加的时候, id 必须是 null 。
JSR-303 定义了 group 概念,每个校验注解都必须支持。校验注解作用在宇段上的时候,可以指定一个或者多个 group , 当 Spring Boot 校验对象的时候,也可以指定校验的上下文属于哪个 group。这样 , 只有 group 匹配的时候,校验注解才能生效。
2.使用@Validated验证入参
在 Controller 中 , 只需要给方法参数加上@Validated 即可触发一次校验 。
参数使用了@Validated 注解,将触发 Spring 的校验 , 井将验证结果存放到 BindingResult 对象中 。 这里, Validated 注解使用了校验的上下文 User.Add.class , 因 此, 整个校验将按照 Add.class 来校验。
BindingResult 包含了验证结果,提供了如下方法 :
- hasErrors ,判断验证是否通过 :
- getAllErrors ,得到所有的错误信息,通常返回的是 FieldError 列表。
方式一:手动处理验证结果
如果 Controller 参数未提供 BindingResult 对象, 则 SpringMVC 将抛出异常。
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import