Springboot请求参数校验

287 阅读2分钟

前端提交的请求参数需要进行校验,如果使用if else语句校验,比较繁琐。使用@Valid和@Validated注解很好的解决了这个问题。

参考:www.oxingsoft.com/blog/articl… 


@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<ObjectError> 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格式