1. 程式人生 > >更加靈活的引數校驗,Spring-boot自定義引數校驗註解

更加靈活的引數校驗,Spring-boot自定義引數校驗註解

上文[測試開發專題:如何在spring-boot中進行引數校驗](https://www.immortalp.com/articles/2020/05/15/1589509696197.html),我們討論瞭如何使用@Min、@Max等註解進行引數校驗,主要是針對基本資料型別和級聯物件進行引數校驗的演示,但是在實際中我們往往需要更為複雜的校驗規則,比如註冊使用者的密碼和確認密碼進行校驗,這個時候基本的註解就無法滿足我們的要求了,需要去按照業務需求去自定義註解進行校驗 ### 元註解 在自定義註解之前我們有必要了解一些元註解,元註解就是在註解上的註解,可以對一個註解進行配置,元註解包括@Retention、@Target、@Document、@Inherited四種 * @Retention,表示註解保留到什麼時候,有以下三種模式 * @Retention(RetentionPolicy.SOURCE) 表示註解僅存在於原始碼中,在class位元組碼檔案中不包含 * @Retention(RetentionPolicy.CLASS) 表示 預設的保留策略,註解會在class位元組碼檔案中存在,但執行時無法獲得 * @Retention(RetentionPolicy.RUNTIME) 表示註解會在class位元組碼檔案中存在,在執行時可以通過反射獲取到  * @Target表示註解的作用目標是什麼,只列出下面幾個,剩餘的大家自行谷歌把 * @Target(ElementType.TYPE) 表示註解可以應用於介面、類、列舉、註解 * @Target(ElementType.FIELD) 表示可以應用於欄位、成員變數、列舉的常量等 * @Target(ElementType.METHOD)表示可以作用於方法 * @Document表示註解包含在javadoc中 * @Inherited表示註解可以被繼承 ### 自定義校驗註解 就以使用者註冊為例,我們需要校驗密碼和確認密碼是否一致以及是否符合密碼的規則,先新建一個PasswordEqual註解類 ```java @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) @Constraint(validatedBy = PasswordValidator.class) public @interface PasswordEqual { String message() default "密碼不一樣"; Class[] groups() default {}; Class[] payload() default {}; } ``` 下面我們來解釋一下上面的註解,在PasswordEqual註解上,又標記了四個註解,前三個我們上面已經說過了。 這裡說一下@Constraint註解,它表示這個註解是一個驗證註解,並且通過validatedBy指定自定義校驗註解的關聯類,PasswordValidator類就是我們自定義的註解關聯的類。 註解裡面的groups和payload方法是模板方法,實現自定義註解必須寫這麼兩個方法。 ### 定義驗證類 驗證類裡面包含具體的驗證邏輯了,下面是一個簡版的: ```java public class PasswordValidator implements ConstraintV