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

文章目录

    • 1.引入依赖
    • 2.字段添加校验注解
    • 3.编写测试控制器
    • 4.全局异常处理
    • 5.分组校验
    • 6.嵌套验证
    • 7.校验注解说明及@Valid与@Validated的区别

1.引入依赖


        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-validationartifactId>
        dependency>

2.字段添加校验注解

springboot参数校验与全局异常处理_第1张图片

@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.编写测试控制器

springboot参数校验与全局异常处理_第2张图片

@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);
    }

}

springboot参数校验与全局异常处理_第3张图片

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

4.全局异常处理

springboot参数校验与全局异常处理_第4张图片
springboot参数校验与全局异常处理_第5张图片

springboot参数校验与全局异常处理_第6张图片
springboot参数校验与全局异常处理_第7张图片
全局异常处理类:

@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;
    }

}

springboot参数校验与全局异常处理_第8张图片
springboot参数校验与全局异常处理_第9张图片
也可以对请求方式异常及Json格式请求体缺失异常进行处理:
springboot参数校验与全局异常处理_第10张图片
springboot参数校验与全局异常处理_第11张图片
springboot参数校验与全局异常处理_第12张图片
springboot参数校验与全局异常处理_第13张图片

5.分组校验

springboot参数校验与全局异常处理_第14张图片
springboot参数校验与全局异常处理_第15张图片
springboot参数校验与全局异常处理_第16张图片
springboot参数校验与全局异常处理_第17张图片
springboot参数校验与全局异常处理_第18张图片
两者的不同效果原因在于Update分组继承了Defualt,Save分组没继承,而
校验注解默认都是Default分组。
springboot参数校验与全局异常处理_第19张图片
springboot参数校验与全局异常处理_第20张图片
springboot参数校验与全局异常处理_第21张图片

6.嵌套验证

springboot参数校验与全局异常处理_第22张图片
springboot参数校验与全局异常处理_第23张图片

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

springboot参数校验与全局异常处理_第24张图片
springboot参数校验与全局异常处理_第25张图片

你可能感兴趣的:(spring,boot,java,restful,spring,boot)