前端提交的请求参数需要进行校验,如果使用if else语句校验,比较繁琐。使用@Valid和@Validated注解很好的解决了这个问题。
@Valid和@Validated的区分
@Validated是@Valid 的一次封装,是Spring提供的。
@Valid不提供分组功能。
@Validated不提供嵌套验证功能。嵌套验证需要在对应的嵌套属性前加@Valid。
实例类增加验证注解
@Data
public class Person {
@NotEmpty(message = 姓名不能为空)
private String name;
@Max(value = 18, message = 年龄不能超过18岁)
private String age;
@Max(value = 1, message = 性别只能为0和1: 0=女1=男)
@Min(value = 0, message = 性别只能为0和1: 0=女1=男)
private Short sex;
}
Controller方法
@RestController
@Slf4j
public class VerifyController {
@PostMapping(value = /valid)
public void verifyValid(@Valid @RequestBody Person person) {
log.info(valid() method, the request params is: {}, JSON.toJSONString(person));
}
@PostMapping(value = /validated)
public void verifyValidated(@Validated @RequestBody Person person) {
log.info(validated() method, the request params is: {}, JSON.toJSONString(person));
}
}
定义一个全局异常类,统一抓取异常
@ControllerAdvice
@ResponseBody
public class GlobleExceptionHandler {
/**
* 要拦截的异常Exception
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result parameterExceptionHandler(MethodArgumentNotValidException e) {
BindingResult exceptions = e.getBindingResult();
// 判断异常中是否有错误信息,如果存在就使用异常中的消息,否则使用默认消息
if (exceptions.hasErrors()) {
List errors = exceptions.getAllErrors();
if (!errors.isEmpty()) {
FieldError fieldError = (FieldError) errors.get(0);
return ResultGenerator.genErrorResult(-1, fieldError.getDefaultMessage());
}
}
return ResultGenerator.genErrorResult(error);
}
}
测试接口校验
附:注解说明
@Null 限制只能为null
@NotNull 限制必须不为null
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字
@Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future 限制必须是一个将来的日期
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@Past 限制必须是一个过去的日期
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@Past 验证注解的元素值(日期类型)比当前时间早
@NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式