方案

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

2021-07-01  本文已影响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:若觉得文章还不错,记得点赞评论转发哦!!!

上一篇下一篇

猜你喜欢

热点阅读