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());
}
}
【2】:使用ErrorController类来实现。具体不做讲解。请自行百度
区别:
1.注解@ControllerAdvice方式只能处理控制器抛出的异常。此时请求已经进入控制器中。
2.类ErrorController方式可以处理所有的异常,包括未进入控制器的错误,比如404,401等错误
3.如果应用中两者共同存在,则@ControllerAdvice方式处理控制器抛出的异常,类ErrorController方式未进入控制器的异常。
4.@ControllerAdvice方式可以定义多个拦截方法,拦截不同的异常类,并且可以获取抛出的异常信息,自由度更大。