上一篇文章我們了解了Spring Boot Web相關的知識,初步了解了spring-boot-starter-web,還了解了@Contrler和@RestController的差別,如果使用@Controller注解只返回數據則需要使用@ResponseBody注解。與此同時還了解了@RequestMapping注解與URL映射,URL映射可以分為URL路徑匹配、Method匹配、consumes和produces匹配、params和header匹配。這篇文章我們將會介紹數據校驗,對于任何應用系統而言,任何客戶端傳入的數據都不是絕對安全有效的,這就要求我們在服務端接收到數據時需要對傳入的數據的有效性進行驗證,以確保傳入的數據安全正確。
Hibernate Validator簡介
目前數據校驗的規范和組件有很多,Spring Boot默認使用的數據校驗組件是基于JSR數據校驗規范的Hibernate Validator,其中常用的注解如下表所示
注解 | 作用目標 | 檢查規則 |
---|---|---|
@NotNull | 屬性 | 檢查值是否為空 |
@Null | 屬性 | 檢查值必須為空 |
@AsserFalse | 屬性 | 檢查演算結果是否為false |
@AssertTrue | 屬性 | 檢查演算結果是否為true |
@Max(value=) | 屬性(以numeric或string類型表示一個數字) | 檢查值是否小于或等于最大值 |
@Min(value=) | 屬性(以numeric或string類型表示一個數字) | 檢查值是否大于或等于最小值 |
@Size(min=, max=) | 屬性(array,collection,map) | 檢查元素大小是否在最大值和最小值之間(包括臨界值) |
@Digits(integer,fraction) | 屬性 | 檢查元素必須是數字且在范圍內 |
@Past | 屬性(data或calender) | 檢查日期是否是過去的日期 |
@Feature | 屬性data或calender) | 檢查日期是否是未來的日期 |
@Pattern(regex="rexgex",flag=) | 屬性 | 檢查值是否與正則表達式匹配 |
@Range(min=,max=) | 屬性(以numeric或string類型表示一個數字) | 檢查元素大小是否在最大值和最小值之間(包括臨界值) |
@Length(min=,max=) | 屬性(String) | 檢查字符串長度是否符合范圍 |
屬性(String) | 檢查是否是有效的Email地址 | |
@NotEmpty | 屬性(String) | 檢查字符串不能為空 |
使用Hibernate Validator校驗數據需要定義一個接受的數據模型,使用注解的形式描述字段的校驗規則,下面以User對象為例說明如何校驗數據,先加入以下依賴:
<dependency>
<groupId>org.springframework.boot<span class="hljs-name"groupId>
<artifactId>spring-boot-starter-validation<span class="hljs-name"artifactId>
<span class="hljs-name"dependency>
JavaBean參數校驗
Post請求參數較多時可以在對應的數據模型(Java Bean)中進行校驗,通過注解來指定字段校驗的規則。
public class User {
@NotBlank(message = "姓名不允許為空")
@Length(min = 2, max = 10, message = "姓名長度錯誤,姓名長度2-10")
private String Name;
@NotNull(message = "年齡不能為空!")
@Min(18)
private int age;
@NotBlank(message = "地址不能為空!")
private String address;
@Email(message = "郵箱格式錯誤")
private String email;
//省略get和set方法
}
上述例子中,每個message是數據校驗不通過時要給出的提示信息。然后需要添加數據校驗方法。
@PostMapping(path = "/check")
public String check(@RequestBody @Valid User user, BindingResult result) {
String name = user.getName();
if (result.hasErrors()) {
List
上面例子中BindingResult是驗證不通過的結果集合,必須跟在被校驗參數后,若被校驗參數之后沒有BindingResult則會拋出BindException異常。
JavaBean對象的級聯校驗
在對象的普通屬性上我們可以直接使用注解進行數據校驗,對于關聯對象也很容易,在關聯對象上添加@Valid注解,關聯對象內部可以正常使用數據校驗注解。代碼如下:
public class User {
@NotBlank(message = "姓名不允許為空")
@Length(min = 2, max = 10, message = "姓名長度錯誤,姓名長度2-10")
private String Name;
@NotNull(message = "年齡不能為空!")
@Min(18)
private int age;
@NotBlank(message = "地址不能為空!")
private String address;
@Email(message = "郵箱格式錯誤")
private String email;
@NotNull(message = "detail不能為空")
@Valid
private UserDetail detail;
//省略get和set方法
}
public class UserDetail {
@NotNull(message = "id不能為空")
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
分組校驗
在不同的情況下,可能對相同javaBean對象的數據校驗規則有所不同,有時需要根據狀態數據對javaBean中的某些屬性字段進行單獨驗證。這時候就可以使用分組校驗功能,即根據狀態啟用一組約束,Hibernate Validator的注解提供了groups參數用于指定分組,如果沒有指定groups參數,則默認屬于javax.validation.groups.Default。接下來我們舉例來說明這一過程。
首先創建分組GroupA和GroupB如下,這兩個接口作為兩個校驗規則的分組。
public interface GroupA {
}
public interface GroupB {
}
然后創建實體類Person,并在相關字段定義分組校驗規則。
public class Person {
@NotBlank(message = "userId不能為空", groups = {GroupA.class})
private String userId;
@NotBlank(message = "用戶名不能為空", groups = {GroupB.class})
private String name;
@Range(min=20, max = 30, message = "年齡必須在【20,30】", groups = {GroupA.class})
@Range(min = 30, max = 40, message = "年齡必須在【30,40】", groups = {GroupB.class})
private int age;
//省略來get方法和set方法
}
上述例子中,在age
字段使用了兩個校驗規則,GroupA年齡要在20-30,GroupB年齡要在30-40。最后使用分組:
@RequestMapping("/save")
public String save(@RequestBody @Validated({ GroupA.class, Default.class}) Person person, BindingResult result) {
if (result.hasErrors()) {
List
其中@Validated
注解中增加了{GroupA.class, Default.class}參數表示對于定義了分組校驗規則的字段使用GroupA規則,其他使用默認規則。
-
Web
+關注
關注
2文章
1263瀏覽量
69467 -
URL
+關注
關注
0文章
139瀏覽量
15340 -
spring
+關注
關注
0文章
340瀏覽量
14343 -
服務端
+關注
關注
0文章
66瀏覽量
7008
發布評論請先 登錄
相關推薦
評論