Spring-Boot 中的@Valid注解和BindingResult

一、@Valid注解的作用

主要是用于数据校验,在实体或者DTO中定义不同的属性,来完成不同的校验规则,然后在Controller类中接收数据的参数前钱夹@Valid注解,那么接收过来的数据就会开启校验功能。

二、@Valid相关注解

在这里插入图片描述

三、BindingResult

bindingResult是和@Valid配合使用,跟在被校验对象之后,
1.如果没写bindingResult,就会排出BindException;
2.如果没写@Valid,bindingResult就接受不到异常。
注意: 不能使用bindingResult来接受String等简单对象的错误信息,简单对象校验失败会抛出ConstraintViolationException。

四、@Valid校验的流程

@Valid不支持平面的参数校验(直接用@PathVariable或@RequestParam接受的参数),所以对GET请求的参数还是按照正常的方式来校验,而POST则将DTO对象为参数,用@Valid方式校验。校验通过进入业务逻辑层,否则抛出异常,由全局异常处理器来处理。

1.DTO类

public class BookDTO {

    @NotBlank
    private String author;
    @NotBlank
    private String name;
    @Length(max=20)
    private String description;
    @NotNull
    private Integer status;


	Getter and Setter....
}

2.Controller接口类

 @PostMapping("/books")
    //@RequestBody可以返回一个Json对象
    public ResponseEntity<?> saveBook(@Valid @RequestBody BookDTO bookDTO, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            throw new InvalidRequestException("Invalid parameter",bindingResult);
        }

        Book book1=bookService.saveBook(bookDTO.convertToBook());
        //新增有专门的状态 201 created
        return new ResponseEntity<Object>(book1, HttpStatus.CREATED);
    }

3.自定义的异常

public class InvalidRequestException extends RuntimeException {

    private Errors errors;

    public InvalidRequestException(String message, Errors errors) {
        super(message);
        this.errors = errors;
    }
}

参考文献

https://www.javazhiyin.com/59643.html
https://www.jianshu.com/p/2432d0f51c0e

发布了25 篇原创文章 · 获赞 2 · 访问量 616
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览