@Validated、@Valid等参数或属性字段校验

spring validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR-303规范),配合BindingResult可以直接提供参数验证结果,校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理
包:package org.springframework.validation.annotation;
在检验Controller的入参是否符合规范时,使用@Validated或者@Valid在基本验证功能上没有太多区别,但是在分组、注解地方、嵌套验证等功能上两个有所不同:

  1. 分组

    @Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制

    @Valid:作为标准JSR-303规范,还没有分组的功能

  2. 注解地方

    @Validated:可以在类、方法和方法参数上。但是不能用在成员属性(字段)上

    @Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上

  3. 嵌套验证

    嵌套验证就是一个实体类用的某个字段属性是一个集合,集合存储其他的实体类,需要验证集合和集合中实体类中的字段属性是否校验合格,称为嵌套验证(或该某个字段属性是其他的实体类,需校验给实体类中的字段是否校验合格)

@Validated和@Valid加在方法参数前,都不会自动对参数进行嵌套验证,需要@Validated和@Valid配合使用,@Validated作用方法的入参,@Valid作用实体类字段

@Validated和@Valid在嵌套验证功能上的区别:

  • @Validated:用在方法入参上无法单独提供嵌套验证功能。不能用在成员属性(字段)上,也无法提示框架进行嵌套验证。能配合嵌套验证注解@Valid进行嵌套验证。

  • @Valid:用在方法入参上无法单独提供嵌套验证功能。能够用在成员属性(字段)上,提示验证框架进行嵌套验证。能配合嵌套验证注解@Valid进行嵌套验证。

@Validated、@Valid等参数或属性字段校验

统一异常处理-->拦截器

@Slf4j
@ControllerAdvice
public class ValidatedExceptionHandler {
 
    /**
     * 处理@Validated参数校验失败异常
     * @param exception 异常类
     * @return 响应
     */
    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result exceptionHandler(MethodArgumentNotValidException exception){
        BindingResult result = exception.getBindingResult();
        StringBuilder stringBuilder = new StringBuilder();
        if (result.hasErrors()) {
            List<ObjectError> errors = result.getAllErrors();
            if (errors != null) {
                errors.forEach(p -> {
                    FieldError fieldError = (FieldError) p;
                    log.warn("Bad Request Parameters: dto entity [{}],field [{}],message [{}]",fieldError.getObjectName(), fieldError.getField(), fieldError.getDefaultMessage());
                    stringBuilder.append(fieldError.getDefaultMessage());
                });
            }
        }
        return ResultUtil.validatedException(stringBuilder.toString());
    }
}

参考地址:https://blog.csdn.net/qq_27680317/article/details/79970590

上一篇:@Validated和@Valid区别:Spring validation验证框架对入参实体进行嵌套验证必须在相应属性(字段)加上@Valid而不是@Validated


下一篇:性能极致优化!ZStack Cloud云平台获华为鲲鹏Validated认证