1. 程式人生 > 程式設計 >Spring 引數校驗詳解

Spring 引數校驗詳解

前言

JCP

JCP 全稱 Java社群程式 (Java Community Process,JCP)

JCP 是一個開放性的國際技術標準組織,職責是發展和更新 Java 技術規範。由24個成員組成的執行委員會則是該組織的最高決策機構,負責規劃 Java 的技術演進方向。

JSR

JSR 全稱 Java 規範提案 (Java Specification Requests,JSR)

是指向JCP提出新增一個標準化技術規範的正式請求。任何人都可以提交JSR,以向Java平臺增添新的API和服務。

JSR已成為Java界的一個重要標準。

Bean Validation

Bean Validation 顧名思義是對 java Bean 的校驗,目前為止,Java 對 Bean 的校驗有3個規範。

JSR-303 : Bean Validation

JSR-303規範官網 JSR-303 : Bean Validation,是一項 java 規範提案,並且於2009年11月16日通過提案,正式成為一項 java 規範。

JSR 349 : Bean Validation 1.1

JSR-349規範官網

JSR 349 : Bean Validation 1.1,故名思議,是 Bean Validation 的 1.1 版本,於2013年5月24日通過提案,正式成為一項 java 規範。

JSR 380 : Bean Validation 2.0

JSR-380規範官網

JSR 380 : Bean Validation 2.0

,故名思議,是 Bean Validation 的 2.0 版本,於2017年8月21日通過提案,正式成為一項 java 規範。

javax.validation

javax.validation 是 Java 官方提供的對 Bean Validation 規範的實現,它提供了 @NotBlank、@NotNull、@NotEmpty 等註解供我們使用。

maven 座標如下

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>
複製程式碼

由於 Bean Validation 有多個版本,因此 javax.validation 也提供了對於版本的實現,如圖

其中

  • 1.0.x 對應 JSR-303 : Bean Validation
  • 1.1.x 對應 JSR 349 : Bean Validation 1.1
  • 2.0.x 對應 JSR 380 : Bean Validation 2.0

Hibernate-Validator

Hibernate-Validator 是 Hibernate 提供的對 JSR-303 : Bean Validation規範的實現,它基於 javax.validation,並在它的基礎上提供了 @Range 、@Length 等註解。

Spring 引數校驗

引數校驗作為web開發最基礎的需求,Spring 自然是對其進行了支援。Spring mvc 中就自帶 Hibernate-Validator 框架,用於對 Java bean 型別的引數進行校驗。

光有 Hibernate-Validator 還不管,因為引數如果不是 Java bean 就沒辦法校驗,因此 spring 增加了對普通引數型別的支援。

因此在使用 spring 框架進行引數校驗時,會使用到多方技術。這就是為什麼用於引數校驗的註解,有的是來自 javax 、有的是來自 Hibernate、有的又來自 spring的原因。

對 Java bean 型別進行引數校驗

參考 使用 Hibernate-Validator 對 Java bean 型別進行引數校驗

對普通型別進行引數校驗

對普通型別進行引數校驗是 spring 框架對 Hibernate-Validator 只能校驗 Java bean 的補充。一般用於引數不多的情況(沒必要為了一兩個引數,單獨封裝一個 java bean)。

這種情況下,我們可以直接把校驗註解打在對應引數上,然後在 controller 上新增 @Validated 註解,這個註解就是 spring 對普通型別引數校驗的支援註解。

例子如下

Spring 引數校驗的異常處理

引數校驗肯定存在校驗不通過的情況,校驗不通過時會丟擲異常,雖然 Spring 對這些異常都進行了預設的處理,但是預設的處理方式並不安全,如下,暴露了很多不該暴露的資訊,對於這些異常,我們需要手動處理。

關於如何處理這些異常,請參考

Spring 引數校驗的異常處理

參考

為什麼要用validator