Springboot请求参数校验

前端提交的请求参数需要进行校验,如果使用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<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格式

 

Java链式调用定义与用法 Springboot配置多数据源
微信公众号