首頁 > 軟體

Java Validated 分組校驗的使用

2022-02-14 19:01:16

前言:

開發中我們會遇到多個介面公用一個請求物件的情況,如果需求變更,勢必會破壞已有程式碼的邏輯,不符合開閉原則,對引數校驗修修補補,不如一開始就劃分明確,所以在這裡記錄下分組校驗註解@Validated的使用。

測試過程:

1.新建SpringBoot專案

新建一個SpringBoot專案,新建module -> 引入依賴 -> 編寫主啟動類 -> 編寫組態檔 -> 新建各種包

2.新建組

Validated有自己預設的組 Default.class

我們要建的組,就是不同業務使用欄位分成的組,舉例的業務是一個使用者物件,使用者有不同的角色,不同的介面會用到這個使用者物件的不同欄位。比如學生(Student),老師(Teacher):

Student

public interface Student {
}

Teacher

public interface Teacher {
}

3.新建請求物件

我們的業務是多個介面共用一個請求物件,所以不同介面用到這個物件裡的欄位一定不同。所以在這裡對不同的欄位作了分組,比如:

  • 老師肯定會有手機號、手下也一定有幾個學生,所以被劃分到Teacher組;
  • 學生一定要有幾本書,所以被劃分到Student組;
  • 沒有被分組的欄位預設是Default組;
  • 給所有欄位用校驗註解新增校驗,以便測試是否分組生效。

UserDTO

@Data
public class UserDTO {

    @NotBlank(message = "id必傳")
    private String id;

    @NotBlank(message = "不能沒有名稱")
    private String name;

    @NotBlank(message = "老師不能沒有手機號", groups = Teacher.class)
    private String phone;

    @NotNull(message = "age必傳")
    private Integer age;

    @NotBlank(message = "不能沒有idCard")
    private String idCard;

    @NotEmpty(message = "學生不能沒有書")
    @Size(min = 2, message = "學生必須有兩本書", groups = Student.class)
    private List<String> bookNames;

    @NotEmpty
    @Size(min = 1, message = "老師不能沒有學生", groups = Teacher.class)
    private List<String> studentNames;
}

4.介面測試

對這個物件的不同業務劃分出5個介面,測試下欄位分組之後的必傳情況: 這樣看的清楚些

Controller

@RestController
public class ValidatedController {
    
    /**
     * 測試 分組校驗 student
     *
     * @date 2022/2/11 15:47:14
     */
    @PostMapping("student")
    public UserDTO validatedStudent(@Validated(value = {Student.class, Default.class}) @RequestBody UserDTO userDTO) {
        return userDTO;
    }

    /**
     * 測試 分組校驗  teacher
     *
     * @date 2022/2/11 15:47:14
     */
    @PostMapping("teacher")
    public UserDTO validatedTeacher(@Validated(value = {Teacher.class, Default.class}) @RequestBody UserDTO userDTO) {
        return userDTO;
    }

    /**
     * 測試 分組校驗  default
     *
     * @date 2022/2/11 15:47:14
     */
    @PostMapping("default")
    public UserDTO validatedDefault(@Validated(value = {Default.class}) @RequestBody UserDTO userDTO) {
        return userDTO;
    }

    /**
     * 測試 分組校驗 onlyStudent
     *
     * @date 2022/2/11 15:47:14
     */
    @PostMapping("onlyStudent")
    public UserDTO validatedOnlyStudent(@Validated(value = {Student.class}) @RequestBody UserDTO userDTO) {
        return userDTO;
    }

    /**
     * 測試 分組校驗 onlyTeacher
     *
     * @date 2022/2/11 15:47:14
     */
    @PostMapping("onlyTeacher")
    public UserDTO validatedOnlyTeacher(@Validated(value = {Teacher.class}) @RequestBody UserDTO userDTO) {
        return userDTO;
    }

}

StudentTeacherDefaultOnlyStudentOnlyTeacher 進行測試

不需要列舉所有情況,這裡就用Student介面做測試。這個介面如果不傳遞Student組的bookNames欄位或者bookNames欄位長度不足 2 就會丟擲異常,但是因為分組的緣故,即使不傳遞Teacher Group的欄位也不會受到影響。

不傳bookNames

只傳遞一個bookNames

5.結論

其它介面例子我就不多說了,因為沒有顯式分組的預設都是Default組,所以,測試介面裡面有Default組的測試,就是預設沒有分組的屬性都歸Default管理;
測試用例中的only這兩個組,就是在沒有Default的情況下,只對Student和Teacher 組的欄位進行校驗;
要注意平常我們寫@Validated註解的時候,預設就是@Validated(group = {Default.class}),也就是預設所有欄位都是Default組的,顯式分組之後,剩下的那些沒有被劃分到自建組的欄位都是Default組;
因為這種機制的出現所以我們可以很靈活的使用物件裡面的某些欄位,比如可以新建一個Master組,可以將Student和Teacher組的欄位都劃分到Master組,以實現類似於高許可權等級的引數傳遞校驗等等操作!

到此這篇關於Java Validated 分組校驗的使用的文章就介紹到這了,更多相關Java Validated 分組校驗內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


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