SpringBoot 入門:08 - 接口參數校驗

咱們此時可能已經寫了好多個接口了,你們有沒有對每一個接口的請求參數進行必要的校驗呢?java

做爲一個系統,外來的數據儘量去嚴格的校驗它的合法性,好比數字類型參數是不是有效數字、是否在最小值與最大值之間等等。正則表達式

徹底能夠本身在每個接口裏執行業務邏輯前對每個請求參數進行校驗,但你會發現挺繁瑣的,並且重複性比較高。因此咱們引入 Spring Boot 的 spring-boot-starter-validation 依賴幫助咱們作這件事情。在 pom.xml 配置裏面加入:spring

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
複製代碼

參數校驗的步驟很簡單:api

第一步在 Controller 層加上 @Validation 註解;數組

第二步在請求參數前加上 @Valid 註解或是直接具體的校驗註解:oracle

@RequestBody @Valid AdminLoginParam param
// 或者
@RequestParam(name = "username") @NotBlank String username
複製代碼

有哪些註解呢?能夠查看 javax.validation.constraints 包或者去 Oracle 官網的 JavaEE 7 Specification APIs 文檔裏查閱。spring-boot

下面列舉一些經常使用的校驗註解:ui

PS:一般咱們接口參數的類型無非就那麼幾種,字符串、數字、數組、文件,而其中文件類型的如今基本都是交由 OSS 對象存儲服務去完成。spa

==@NotBlank==code

校驗參數是否爲空,只支持繼承了 CharSequence 接口的類型。其中 null 和全空白字符串都是不合法的,null 好理解,全空白字符串的意思就是隻由一個或多個 whitespace 字符組成的字符串,好比空格、Tab鍵、換行符等(能夠經過 Character.isWhitespace() 方法判斷是不是空白字符)。

@RequestParam(name = "username", required = false)
@NotBlank
String username
複製代碼

==@Min / @Max==

校驗參數的大小範圍,支持數字類型,好比 byte、short、int、long 和他們的包裝類。注意 double 和 float 是不能用這個註解來校驗的。

和這兩個註解相似的還有 @Negative / @NegativeOrZero / @Positive / @PositiveOrZero,看名稱也能知道用來校驗什麼了。

==@Size==

校驗參數的長度範圍,支持的參數類型能夠是繼承了 CharSequence 接口的類型(好比字符串)、繼承了 Collection 接口的類型、繼承了 Map 接口的類型、Array 數組類型。

好比接口有一個 username 參數,限定它的長度在 6-10 之間,能夠這麼寫:

@RequestParam(name = "username", required = false)
@Size(min = 6, max = 10)
String username
複製代碼

這裏咱們須要注意 null 值,這個註解對 null 值認爲是合法的,因此若是接口調用方不傳這個參數,而咱們又將該參數設爲非必傳(required = false),那麼在使用過程當中須要當心。

==@Pattern==

校驗是否符合給定的正則表達式,場景也很普遍,好比咱們要校驗手機號、IP地址、密碼等基於各自業務場景包含特定規則的參數,就很適合用這個註解來作,避免去自定義校驗註解。

好比接口有一個 phone 參數,能夠這麼寫(偷懶的手機號正則表達式哈):

@RequestParam(name = "phone")
@Pattern(regexp = "^1[0-9]{10}$")
String phone
複製代碼

對於全部校驗失敗的狀況,Validation 都會拋出一個 ConstraintViolationException 異常。全部的 Validation 註解均可以添加 message 參數,用於自定義錯誤提示,因此在全局捕獲異常的時候,就能夠用這個 message 來自定義錯誤信息,異常處理會在後面一篇文章中提到。

相關文章
相關標籤/搜索