使用spring boot開發(fā)的道友們,或許或多或少有用到過這兩個注解献联,那么今天我們就來探查一下這兩者的異同。
兩者都可以使開發(fā)人員寫的注解校驗(yàn)規(guī)則生效,例如在某一個字段上加上@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類的方法的參數(shù)上寫的檢驗(yàn)規(guī)則
只能用@Validated并且得寫在類名上参袱,寫在方法上、參數(shù)名前面都不生效秽梅,并且參數(shù)只能是java的原生類型及其對應(yīng)的引用類抹蚀,如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方法的參數(shù):
@GetMapping(value = "/list")
public void save(@RequestBody BankDto bankDto){
System.out.println();
return;
}
此時,繼續(xù)在Controller類名上使用@Validated是不能bankCode的校驗(yàn)規(guī)則生效的钞诡;需要寫在dto參數(shù)名前面镐捧,如果有多個參數(shù),則需要每個都加上臭增,此時使用@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的校驗(yàn)固然生效列牺,但是secondDto屬性的對應(yīng)的對象里的username校驗(yàn)將不會生效,如下圖:
這里就涉及到校驗(yàn)規(guī)則的嵌套問題了拗窃,必須在對象屬性上加@Valid瞎领,并且只能使用這個,只能寫在屬性的上方随夸,只有@Valid可以在校驗(yàn)規(guī)則嵌套九默;修改BankDto類:@Validprivate SecondDto secondDto;繼續(xù)上面的請求則會報錯:
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宾毒,則會逐個檢驗(yàn)SecondDto的校驗(yàn)規(guī)則驼修;
如果還有更深一層的對象屬性,繼續(xù)在該屬性上方加上@Valid注解。以上則是@Valid與@Validated在開發(fā)中常見的場景乙各,至于其它涉及的規(guī)則分組的這里暫不討論墨礁,往后研究過后再慢慢補(bǔ)上,望各位道友見諒耳峦!
PS:若覺得文章還不錯恩静,記得點(diǎn)贊評論轉(zhuǎn)發(fā)哦!6卓馈驶乾!