1. 程式人生 > >如何在專案中優雅的校驗引數

如何在專案中優雅的校驗引數

## 本文看點 ![](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` | 檢查帶註釋的值是否包含潛在的惡意片