Like Share Discussion Bookmark Smile

J.J. Huang   2019-04-02   Spring Boot   瀏覽次數:

SpringBoot - 第十九章 | 資料驗證(一)

在開發時,對於請求參數,一般上都需要進行參數合法性校驗的,原先的寫法時一個個字段一個個去判斷,這種方式太不通用了,所以 java 的 JSR 303:Bean Validation 規範就是解決這個問題。

JSR 303 只是個規範,並沒有具體的實現,目前通常都是由 hibernate-validator 進行統一參數校驗。

簡單介紹

  • JSR303定義的校驗類型
Constraint(約束) 說明
@Null 被註解的元素必須為 null
@NotNull 被註解的元素必須不為 null
@AssertTrue 被註解的元素必須為 true
@AssertFalse 被註解的元素必須為 false
@Min(value) 被註解的元素必須是一個數字,其值必須大於等於指定的最小值
@Max(value) 被註解的元素必須是一個數字,其值必須小於等於指定的最大值
@DecimalMin(value) 被註解的元素必須是一個數字,其值必須大於等於指定的最小值
@DecimalMax(value) 被註解的元素必須是一個數字,其值必須小於等於指定的最大值
@Size(max, min) 被註解的元素的大小必須在指定的範圍內
@Digits (integer, fraction) 被註解的元素必須是一個數字,其值必須在可接受的範圍內
@Past 被註解的元素必須是一個過去的日期
@Future 被註解的元素必須是一個將來的日期
@Pattern(value) 被註解的元素必須符合指定的正則表達式

- Hibernate Validator 附加的 constraint
Constraint(約束) 說明
@Email 被註解的元素必須是電子郵箱地址
@Length 被註解的字符串的大小必須在指定的範圍內
@NotEmpty 被註解的字符串的必須非空
@Range 被註解的元素必須在合適的範圍內

spring-boot-starter-web 包裡面有 hibernate-validator 包,所以如果開發 web 就不需要重複添加 spring-boot-starter-validation 依賴了。但如果沒用 web 依賴時候想要實現 Bean 驗證,則只要單單加入 spring-boot-starter-validation 依賴即可。

簡單範例

建立 Customer

建立 DemoController

測試(未帶參數)

啟動應用,http://localhost:8080/demo

瀏覽器訪問

Postman訪問

Postman完整的Response

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
{
"timestamp": "2019-04-02T13:16:58.123+0000",
"status": 400,
"error": "Bad Request",
"errors": [
{
"codes": [
"NotNull.customer.createBy",
"NotNull.createBy",
"NotNull.java.lang.String",
"NotNull"
],
"arguments": [
{
"codes": [
"customer.createBy",
"createBy"
],
"arguments": null,
"defaultMessage": "createBy",
"code": "createBy"
}
],
"defaultMessage": "createBy不可為空",
"objectName": "customer",
"field": "createBy",
"rejectedValue": null,
"bindingFailure": false,
"code": "NotNull"
},
{
"codes": [
"NotNull.customer.age",
"NotNull.age",
"NotNull.java.lang.Integer",
"NotNull"
],
"arguments": [
{
"codes": [
"customer.age",
"age"
],
"arguments": null,
"defaultMessage": "age",
"code": "age"
}
],
"defaultMessage": "age不可為空",
"objectName": "customer",
"field": "age",
"rejectedValue": null,
"bindingFailure": false,
"code": "NotNull"
},
{
"codes": [
"NotNull.customer.name",
"NotNull.name",
"NotNull.java.lang.String",
"NotNull"
],
"arguments": [
{
"codes": [
"customer.name",
"name"
],
"arguments": null,
"defaultMessage": "name",
"code": "name"
}
],
"defaultMessage": "name不可為空",
"objectName": "customer",
"field": "name",
"rejectedValue": null,
"bindingFailure": false,
"code": "NotNull"
}
],
"message": "Validation failed for object='customer'. Error count: 3",
"path": "/demo"
}

測試(正確參數)

啟動應用,http://localhost:8080/demo?age=10&name=J.J.Huang&createBy=J.J.

瀏覽器訪問

Postman訪問

BindingResult的使用

在驗證不通過的時候,就會向上方一樣,直接返回拋出異常,而使用 BindingResult 可以讓我們對其做一些對應處理,
例如判斷該跳轉到別的頁面、顯示不同的警示…等等。

編輯 DemoController

測試(未帶參數)

啟動應用,http://localhost:8080/demo/bindingResult

瀏覽器訪問

Postman訪問

本想簡單介紹Validator,結果發現其實滿多東西滿有趣的。而這篇文章只是使用了 @Valid 進行簡單的資料驗證,讓大家先有個感覺,後面還有 @Validated 和 自定義驗證類…等等,後面會繼續講解。

註:以上參考了
JSR 303: Bean Validation
The Bean Validation reference implementation
oKongSpringBoot | 第八章:统一异常、数据校验处理文章。
spring boot validator 验证