首頁 > 軟體

使用註解@Validated和BindingResult對入參進行非空校驗方式

2021-10-23 22:00:44

註解@Validated和BindingResult對入參非空校驗

在專案當中少不了入參校驗,伺服器和瀏覽器互不信任,不能因為前端加入參判斷了後臺就不處理了,這樣是不對的。

比如前臺傳過來一個物件作為入參引數,這個物件中有些屬性允許為空,有些屬性不允許為空。那麼你還在使用if()else{}進行非空判斷嗎?不妨嘗試下使用註解,可以使用@Validated和BindingResult

注意:BindingResult需要放到@Validated後面

範例程式碼如下:普通屬性可以用@NotEmpty() 特殊的使用@NotNull() 比如:列舉型別

實體類:什麼不允許為空就加

@NotEmpty(groups = {SchoolDTO.SchoolGroup.class},message = "學校名不能為空")

注意:重要的事情叮囑兩遍。public interface SchoolGroup{} 別忘了加這個!public interface SchoolGroup{} 別忘了加這個!

public class SchoolDTO implements Serializable { 
    private Long id;
    @NotEmpty(groups = {SchoolDTO.SchoolGroup.class},message = "學校名不能為空")
    private String schoolName;
 
    @NotNull
    @NotEmpty(groups = {SchoolDTO.SchoolGroup.class},message = "學校負責人不能為空")
    private String schoolPrincipal;
 
    @NotNull
    @NotEmpty(groups = {SchoolDTO.SchoolGroup.class},message = "職務不能為空")
    private String principalPosition;
 
    @NotNull
    @NotEmpty(groups = {SchoolDTO.SchoolGroup.class},message = "聯絡電話不能為空")
    private String schoolPhone; 
    //getter setter tostring 省略
    public interface SchoolGroup{}  別忘了加這個
}

控制層:在入參物件上加@Validated({SchoolDTO.SchoolGroup.class}), BindingResult bindingResult @Validated進行驗證,BindingResult可以獲取校驗錯誤資訊

  @PostMapping("/schools")
    @PreAuthorize("hasRole("" + AuthoritiesConstants.ADMIN + "")")
    public Map<String,Object> createSchool(@RequestBody @Validated({SchoolDTO.SchoolGroup.class}) SchoolDTO schoolDTO,BindingResult bindingResult) throws Exception {
      //返回校驗錯誤資訊
        Map<String,Object>map=new HashMap<>();
        if(bindingResult.hasErrors()){
            map.put("success","false");
            map.put("message",bindingResult.getAllErrors());
            return map;
        }
        // .........業務省略 
            return map;
        }
    }

測試:入參的時候我沒有傳principalPosition和schoolPhone

@Validated 和 BindingResult 使用遇到的坑

@Validated 與BindingResult 需要相鄰,否則 變數result 不能接受錯誤資訊

控制檯輸出

Field error in object 'entity' on field '變數': rejected value [null]; codes [NotNull.entity.變數,NotNull.變數,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes

正確的內容截圖

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com