一文探知@Valid和@Validated 的區(qū)別(一)

使用spring boot開發(fā)的道友們,或許或多或少有用到過這兩個注解,那么今天我們就來探查一下這兩者的異同。

兩者都可以使開發(fā)人員寫的注解校驗規(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ù)上寫的檢驗規(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的校驗規(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的校驗固然生效,但是secondDto屬性的對應(yīng)的對象里的username校驗將不會生效,如下圖:

debug

postman

這里就涉及到校驗規(guī)則的嵌套問題了,必須在對象屬性上加@Valid,并且只能使用這個,只能寫在屬性的上方,只有@Valid可以在校驗規(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,則會逐個檢驗SecondDto的校驗規(guī)則;

如果還有更深一層的對象屬性,繼續(xù)在該屬性上方加上@Valid注解。以上則是@Valid與@Validated在開發(fā)中常見的場景,至于其它涉及的規(guī)則分組的這里暫不討論,往后研究過后再慢慢補上,望各位道友見諒!

PS:若覺得文章還不錯,記得點贊評論轉(zhuǎn)發(fā)哦?。。?/strong>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容