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 : Bean Validation 1.1,故名思議,是 Bean Validation 的 1.1 版本,於2013年5月24日通過提案,正式成為一項 java 規範。
JSR 380 : Bean Validation 2.0
JSR 380 : Bean Validation 2.0
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 對這些異常都進行了預設的處理,但是預設的處理方式並不安全,如下,暴露了很多不該暴露的資訊,對於這些異常,我們需要手動處理。
關於如何處理這些異常,請參考