一文探知@Valid和@Validated 的区别(一)
使用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校验将不会生效,如下图:
debugpostman
这里就涉及到校验规则的嵌套问题了,必须在对象属性上加@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:若觉得文章还不错,记得点赞评论转发哦!!!