更加靈活的引數校驗,Spring-boot自定義引數校驗註解
阿新 • • 發佈:2020-05-15
上文[測試開發專題:如何在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