JSR-303参数校验

步骤

1.创建校验参数类

import lombok.Data;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.*;
import java.util.Date;

/**
 * 参数验证请求参数
 * @Author shizhongcai
 * @Date 2019/11/20 15:35
 */
@Data
public class ValidatorReqVo{

    @NotNull(message = "id不能为空")
    private Integer id;

    @NotNull
    @Future(message = "格式为yyyy-MM-dd,且为将来时间")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date future;

    @NotNull
    @DecimalMin(value = "0.1")
    @DecimalMax(value = "1000")
    private Double doubleValue;

    @NotNull
    @Min(value = 1)
    @Max(value = 10)
    private Integer intValue;

    @NotNull
    @Range(min = 1,max = 10,message = "最小为1,最大为10")
    private Integer range;

    @NotBlank
    @Email
    private String email;

    @NotBlank
    @Size(min = 10,max = 20,message = "字符串长度在10-20之间")
    private String strSize;

}

2.全局异常捕获类中添加MethodArgumentNotValidException异常捕获

   /**
     * 参数校验异常
     * @param e
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public BaseRspVo handleException(MethodArgumentNotValidException e) {
        logger.error("请求参数不合法{}",e.getBindingResult());
        //获取所有校验失败项
        List<FieldError> errors = e.getBindingResult().getFieldErrors();
        //处理异常校验项
        Map<String,String> errorMap = new HashMap<>();
        if(!CollectionUtils.isEmpty(errors)) {
            for (FieldError error : errors) {
                errorMap.put(error.getField(),error.getDefaultMessage());
            }
        }
        BaseRspVo baseRspVo =  BaseRspVo.fail(ErrorCodesEnum.PARAM_ERROR);
        baseRspVo.setData(errorMap);
        return baseRspVo;
    }

3.测试Controller编写

 /**
     * 测试参数校验
     * @param reqVo
     * @return
     */
    @PostMapping(value = "/testValidate")
    public BaseRspVo testValidate(@Validated @RequestBody ValidatorReqVo reqVo){
        return new BaseRspVo<>(Arrays.asList("1","2"));
    }

4.模拟请求入参

{
	"id": 1,
	"intValue": 10,
	"doubleValue": 2.2,
	"future": "2019-11-21",
	"range": 1,
	"strSize": "2321213123",
	"email": "a121@wdw.com"
}

参数校验注解参考表

| 注解 | 描述 | | - | - | |@NotNull |限制必须不为null| |@NotEmpty |验证注解的元素值不为 null 且不为空(字符串长度不为0、集合大小不为0)| |@NotBlank |验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格| |@Pattern(value) |限制必须符合指定的正则表达式| |@Size(max,min) |限制字符长度必须在 min 到 max 之间(也可以用在集合上)| |@Email |验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式| |@Max(value) |限制必须为一个不大于指定值的数字| |@Min(value) |限制必须为一个不小于指定值的数字| |@DecimalMax(value) |限制必须为一个不大于指定值的数字| |@DecimalMin(value) |限制必须为一个不小于指定值的数字| |@Null |限制只能为null(很少用)| |@AssertFalse |限制必须为false (很少用)| |@AssertTrue |限制必须为true (很少用)| |@Past |限制必须是一个过去的日期| |@Future |限制必须是一个将来的日期| |@Digits(integer,fraction)| 限制必须为一个小数,且整数部分的位数不能超过 integer,小数部分的位数不能超过 fraction (很少用)|

refer to : https://blog.csdn.net/qq_32867467/article/details/90292737