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的区别

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值