Spring 參數校驗詳解

前言

JCP

JCP 全稱 Java社區進程 (Java Community Process,JCP)java

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

JSR

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

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

JSR已成爲Java界的一個重要標準。安全

Bean Validation

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

JSR-303 : Bean Validation

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

JSR 349 : Bean Validation 1.1

JSR-349規範官網框架

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

JSR 380 : Bean Validation 2.0

JSR-380規範官網post

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 參數校驗的異常處理

相關文章
相關標籤/搜索