美文网首页方案
一文探知@Valid和@Validated 的区别(一)

一文探知@Valid和@Validated 的区别(一)

作者: 技术指北 | 来源:发表于2021-07-01 22:32 被阅读0次

    使用spring boot开发的道友们,或许或多或少有用到过这两个注解,那么今天我们就来探查一下这两者的异同。

    两者都可以使开发人员写的注解校验规则生效,例如在某一个字段上加上@NotNull、@NotBlank。

    1)所属jar包:

    @Valid 所在jar为validation-api,例如
    validation-api-2.0.1.Final.jar;@Validated为spring-context,例如:spring-context-5.0.5.RELEASE.jar ;

    2)在Controller类的方法的参数上写的检验规则

    只能用@Validated并且得写在类名上,写在方法上、参数名前面都不生效,并且参数只能是java的原生类型及其对应的引用类,如Integer、String、int等,下面举例说明:新建一个Controller类 TestController.java

    @Validated
    @RestController
    @RequestMapping(value = "/testBank")
    public class TestController {
    
        @GetMapping(value = "/list")
        public void save(@NotBlank(message = "id不能传空") String id){
                System.out.println();
                  return;
        }
    }
    

    3) 新建一个Dto类 BankDto.java:

    @Data
    public class BankDto {
    @NotBlank(message = "bankCode不能为空")
    private String bankCode;
    }
    
    //修改TestController.save方法的参数:
    @GetMapping(value = "/list")
    public void save(@RequestBody BankDto bankDto){
      System.out.println();
      return;
    }
    

    此时,继续在Controller类名上使用@Validated是不能bankCode的校验规则生效的;需要写在dto参数名前面,如果有多个参数,则需要每个都加上,此时使用@Valid或者@Validated都可以;示例如下:

    public void save(@Valid @RequestBody BankDto bankDto)
    public void save(@Validated @RequestBody BankDto bankDto)
    

    4)新建一个 Dto类 SecondDto.java:

    @Data
    public class SecondDto {
      @NotBlank(message = "username不能为空")
      private String username;
    }
    
    //并在BankDto类中添加一个属性:
    @Data
    public class BankDto {
      @NotBlank(message = "bankCode不能为空")
      private String bankCode;
      private SecondDto secondDto;
    }
    

    注意,此时再按照 3)的写法,bankCode的校验固然生效,但是secondDto属性的对应的对象里的username校验将不会生效,如下图:

    debug
    postman

    这里就涉及到校验规则的嵌套问题了,必须在对象属性上加@Valid,并且只能使用这个,只能写在属性的上方,只有@Valid可以在校验规则嵌套;修改BankDto类:@Validprivate SecondDto secondDto;继续上面的请求则会报错:

    Resolved [
    org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public void com.bigone.network.controller.TestController.save(com.bigone.network.dto.BankDto): [Field error in object 'bankDto' on field 'secondDto.username': rejected value [null]; codes [NotBlank.bankDto.secondDto.username,NotBlank.secondDto.username,NotBlank.username,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [bankDto.secondDto.username,secondDto.username]; arguments []; default message [secondDto.username]]; default message [username不能为空]] ]

    如果属性是对象集合也是一样,如@Validprivate List<SecondDto> secondDto;此时如果集合长度不为0,则会逐个检验SecondDto的校验规则;

    如果还有更深一层的对象属性,继续在该属性上方加上@Valid注解。以上则是@Valid与@Validated在开发中常见的场景,至于其它涉及的规则分组的这里暂不讨论,往后研究过后再慢慢补上,望各位道友见谅!

    PS:若觉得文章还不错,记得点赞评论转发哦!!!

    相关文章

      网友评论

        本文标题:一文探知@Valid和@Validated 的区别(一)

        本文链接:https://www.haomeiwen.com/subject/mnmsultx.html