1、@Validated参数校验

【1】:实体类dto

package com.cc.common.dto;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.util.List;
import java.util.Set;

/**
 * 用户入参dto
 * @author cc
 * @data 2021年06月29日 21:27
 */
@Data
public class UserDto {

    private Long id;

    @NotBlank(message = "姓名不可为空", groups = Set.class)
    private String name;

    @NotBlank(message = "密码不可为空", groups = List.class)
    private String passWord;

    private String token;

}

【2】:Controller中@Valid表示这个实体参数交给Spring去校验

@RequestMapping("/login")
public ReturnVo login(@RequestBody @Validated({Set.class, List.class}) UserDto dto){
    ReturnVo login = loginService.login(dto);
    return login;
}

【3】:校验规则

注解

解释

@Null

被注释的元素必须为 null

@NotNull

被注释的元素必须不为 null

@NotEmpty

验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)

@NotBlank

验证注解的元素值不为空(不为null并去除首尾位空格)

@AssertFalse

被注释的元素必须为 false

@AssertTrue

被注释的元素必须为 true

@DecimalMax(value)

被注释的元素必须是一个数字,其值必须小于等于指定的最大值

@DecimalMin(value) 

被注释的元素必须是一个数字,其值必须大于等于指定的最小值

@Digits (integer, fraction)

被注释的元素必须是一个数字,其值必须在可接受的范围内

@Email

被注释的元素必须是电子邮箱地址

@Future

被注释的元素必须是一个将来的日期

@Past

限制必须是一个过去的日期

@Max(value)

被注释的元素必须是一个数字,其值必须小于等于指定的最大值

@Min(value) 

被注释的元素必须是一个数字,其值必须大于等于指定的最小值

@Pattern(value)

限制必须符合指定的正则表达式

@Size(max,min)

限制字符长度必须在min到max之间

2、异常统一校验

【1】:使用@ControllerAdvice和@ExceptionHandler注解, 注解@ControllerAdvice表示这是一个控制器增强类,当控制器发生异常且符合类中定义的拦截异常类,将会被拦截。

示例

package com.cc.common.component.exceptionHandler;

import com.cc.common.utils.ReturnVoUtil;
import com.cc.common.vo.ReturnVo;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;

/**
 * @author cc
 * @data 2021年07月03日 14:37
 */
@ControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 参数校验统一返回
     * @author cc
     * @date 2021/7/3 14:40
     */
    @ResponseBody
    @ExceptionHandler({MethodArgumentNotValidException.class})
    public ReturnVo parameterExceptionHandler(MethodArgumentNotValidException e){
        e.printStackTrace();
        StringBuffer msg = new StringBuffer();
        List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
        for (FieldError fieldError : fieldErrors) {
            msg.append(fieldError.getDefaultMessage()).append(" ");
        }
        return ReturnVoUtil.error(msg.toString());
    }
}

springboot参数分组校验 springboot 检验入参_List

【2】:使用ErrorController类来实现。具体不做讲解。请自行百度

区别:

1.注解@ControllerAdvice方式只能处理控制器抛出的异常。此时请求已经进入控制器中。

2.类ErrorController方式可以处理所有的异常,包括未进入控制器的错误,比如404,401等错误

3.如果应用中两者共同存在,则@ControllerAdvice方式处理控制器抛出的异常,类ErrorController方式未进入控制器的异常。

4.@ControllerAdvice方式可以定义多个拦截方法,拦截不同的异常类,并且可以获取抛出的异常信息,自由度更大。