springboot参数校验与全局异常处理

1.引入依赖

<!--        参数校验依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

2.字段添加校验注解

在这里插入图片描述

@Data
@ApiModel("用户视图模型")
public class UserVo {
    
    

    @ApiModelProperty("主键")
    @DecimalMax(value = "99",message = "id 不能大于99")
    private Integer id;

    @ApiModelProperty("姓名")
    @NotBlank(message = "name 不能为空")
    private String name;

    @ApiModelProperty("年龄")
    @NotNull(message = "age 不能为null")
    private Integer age;

    @NotEmpty(message = "sex 不能为空")
    private String sex;

    @Size(max = 11)
    private String phone;

}

3.编写测试控制器

在这里插入图片描述

@RestController
@RequestMapping("vilidation")
@Api(tags = "参数校验测试")
public class VilidationController {
    
    

    @ApiOperation("表单格式接口")
    @GetMapping("form")
    public R form(@Valid UserVo userVo, BindingResult bindingResult){
    
    
        List<FieldError> fieldErrors = bindingResult.getFieldErrors();
        List<String> collect = fieldErrors.stream().map(o -> o.getDefaultMessage()).collect(Collectors.toList());
        return R.error().code(HttpStatus.BAD_REQUEST.value()).message("请求参数错误").data("list",collect);
    }

}

在这里插入图片描述

考虑到每个接口都要有绑定结果接口BindingResult做为参数来获取错误信息非常繁琐,我们可以用全局异常处理。

4.全局异常处理

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
全局异常处理类:

@RestControllerAdvice
public class GlobalControllerAdvice {
    
    
    private static final String BAD_REQUEST_MSG = "客户端请求参数错误";
    // <1> 处理 form data方式调用接口校验失败抛出的异常
    @ExceptionHandler(BindException.class)
    public R bindExceptionHandler(BindException e) {
    
    
        List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
        List<String> collect = fieldErrors.stream()
                .map(o -> o.getDefaultMessage())
                .collect(Collectors.toList());
        return  R.error().message("表单参数错误").code(HttpStatus.BAD_REQUEST.value()).
                data("list",collect);
    }


    // <2> 处理 json 请求体调用接口校验失败抛出的异常
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public R methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
    
    
        List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
        List<String> collect = fieldErrors.stream()
                .map(o -> o.getDefaultMessage())
                .collect(Collectors.toList());
        return  R.error().message("json格式参数错误").code(HttpStatus.BAD_REQUEST.value()).
                data("list",collect);
    }

    // <3> 处理单个参数校验失败抛出的异常
    @ExceptionHandler(ConstraintViolationException.class)
    public R constraintViolationExceptionHandler(ConstraintViolationException e) {
    
    
        Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations();
        List<String> collect = constraintViolations.stream()
                .map(o -> o.getMessage())
                .collect(Collectors.toList());
        return  R.error().message("单参数格式错误").code(HttpStatus.BAD_REQUEST.value()).
                data("list",collect);
    }


}

控制器类:

@RestController
@RequestMapping("vilidation")
@Api(tags = "参数校验测试")
@Validated
public class VilidationController {
    
    

    @ApiOperation("表单格式接口")
    @GetMapping("form")
    public R form(@Validated UserVo userVo){
    
    
        return R.ok().data("uservo",userVo);
    }

    @ApiOperation("json格式接口")
    @PostMapping("json")
    public R json(@Valid @RequestBody UserVo userVo){
    
    
        return R.ok().data("uservo",userVo);
    }

    @ApiOperation("单参数接口")
    @GetMapping("single")
    public R single( @NotBlank(message = "id不能为空")  String id,
                    @NotBlank(message = "请输入用户名") String username){
    
    
        return null;
    }

}

在这里插入图片描述
在这里插入图片描述
也可以对请求方式异常及Json格式请求体缺失异常进行处理:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.分组校验

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
两者的不同效果原因在于Update分组继承了Defualt,Save分组没继承,而
校验注解默认都是Default分组。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.嵌套验证

在这里插入图片描述
在这里插入图片描述

7.校验注解说明及@Valid与@Validated的区别

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/worilb/article/details/120688125
今日推荐