如何在專案中優雅的校驗引數
阿新 • • 發佈:2020-12-07
## 本文看點
![](https://img.youpai.lqcoder.com/mweb/2020/12/07/rii1c750dcu55icvubxopy454c743sb9
)
## 前言
驗證資料是貫穿所有應用程式層(從表示層到持久層)的常見任務。通常在每一層實現相同的驗證邏輯,這既費時又容易出錯。為了避免重複這些驗證,開發人員經常將驗證邏輯直接捆綁到域模型中,將域類與驗證程式碼混在一起,這些驗證程式碼實際上是關於類本身的元資料,與業務邏輯不相關。
![application-layers](https://img2020.cnblogs.com/other/1673435/202012/1673435-20201207154301234-1451057691.png)
JSR 380——Bean Validation2.0——定義了用於實體和方法驗證的元資料模型和API,將資料校驗邏輯通過註解的形式封裝在實體物件中。
![application-layers2](https://img2020.cnblogs.com/other/1673435/202012/1673435-20201207154302007-1823359202.png)
## 1.關於JSR
JSR是Java Specification Requests的縮寫,意思是Java 規範提案。是指向[JCP](https://link.jianshu.com?t=http%3A%2F%2Fbaike.baidu.com%2Fview%2F148425.htm)(Java Community Process)提出新增一個標準化技術規範的正式請求。任何人都可以提交JSR,以向Java平臺增添新的API和服務。JSR已成為Java界的一個重要標準。
JSR-303 是JAVA EE 6 中的一項子規範,後來的版本是Bean Validation 1.1(JSR-349),目前最新版本是Bean Validation 2.0(JSR-380),**Hibernate Validator** 是 Bean Validation 的參考實現 ,除了Jakarta Bean驗證API定義的約束之外,Hibernate Validator還有一些附加的 constraint;**並且spring-boot-starter-web預設集成了Hibernate Validator**。(**springboot2.3版本已經移除hibernate-validator的依賴,需要手動引入**)
![image-20201203102541552](https://img2020.cnblogs.com/other/1673435/202012/1673435-20201207154302408-147979390.png)
## 2.為什麼使用Hibernate Validator
- 提高程式碼整潔度;
- 驗證邏輯與業務邏輯之間進行了分離,降低了程式耦合度;
- 統一且規範的驗證方式,無需你再次編寫重複的驗證程式碼;
- 你將更專注於你的業務,將這些繁瑣的事情統統丟在一邊。
## 3.註解介紹
### JSR 380內建常用註解
| **註解** | **詳細資訊** |
| :---------------------------- | :------------------------------------------------------- |
| `@Null` | 被註釋的元素必須為 `null` |
| `@NotNull` | 被註釋的元素必須不為 `null` |
| `@AssertTrue` | 被註釋的元素必須為 `true` |
| `@AssertFalse` | 被註釋的元素必須為 `false` |
| `@Min(value)` | 被註釋的元素可以是字串、數值型別,如果元素是字串型別,將值轉為BigDecimal型別,並與value屬性進行比對,值必須大於等於指定的value值 |
| `@Max(value)` | 被註釋的元素可以是字串、數值型別,如果元素是字串型別,將值轉為BigDecimal型別,並與value屬性進行比對,值必須小於等於指定的value值 |
| `@DecimalMin(value)` | 被註釋的元素可以是字串、數值(可以帶小數點),將註解內value的值轉為BigDecimal型別,必須大於等於指定的最小值(可以配置是否等於value,預設是包含的) |
| `@DecimalMax(value)` | 被註釋的元素可以是字串、數值(可以帶小數點),將註解內value的值轉為BigDecimal型別,其值必須小於等於指定的最大值(可以配置是否等於value,預設是包含的) |
| `@Size(max, min)` | 被註釋的元素的大小必須在指定的範圍內,可用於字串、Collection、Map、陣列等型別 |
| `@Digits (integer, fraction)` | 被註釋的元素必須是一個數字,其值必須在可接受的範圍內 |
| `@Past` | 被註釋的元素必須是一個過去的日期 |
| `@Future` | 被註釋的元素必須是一個將來的日期 |
| `@Pattern(value)` | 被註釋的元素必須符合指定的正則表示式 |
| `@Email` | 被註釋的元素必須是電子郵箱地址 |
| `@NotBlank` | 驗證字串非null,且trim後長度必須大於0 |
| `@NotEmpty` | 適用於String、Collection、Map或者陣列不能為Null且長度或元素個數必須大於0 |
| @Valid | 具體作用下面會列舉 |
### Hibernate Validator 附加的 constraint
| **註解** | **詳細資訊** |
| -------------- | -------------------------------------- |
| `@Length` | 被註釋的字串的大小必須在指定的範圍內 |
| `@URL` | 根據RFC2396標準校驗註釋的字串必須是一個的有效的url |
| `@Range` | 被註釋的元素必須在合適的範圍內,應用於數值或字串 |
| `@UniqueElements` | 檢查帶註釋的集合是否只包含唯一的元素。相等性是使用equals()方法確定的。 |
| `@SafeHtml` | 檢查帶註釋的值是否包含潛在的惡意片