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

本文详细探讨了SpringBoot中@Valid和@Validated注解的使用,包括它们的差异、校验规则生效条件以及嵌套验证的处理。通过实例展示了如何在Controller中进行参数校验,特别强调了@Validated在处理对象嵌套验证时的注意事项。
摘要由CSDN通过智能技术生成

使用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的校验规则

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值