web項目之數據校驗
數據校驗
在web開發中,數據校驗是非常重要的,後端程序必須通過嚴格的校驗來確保前端傳入或者數據層獲取的各項參數從語義上來講是正確的。
JSR 是一個規範文檔,指定了一整套 API,通過標註給對象屬性添加約束。而Hibernate Validator 是 JSR 規範的具體實現,Hibernate Validator 提供了 JSR 規範中所有內置約束註解的實現,以及一些附加的約束註解,除此之外用戶還可以自定義約束註解。
使用 Hibernate Validator 校驗數據,需要定義一個接收的數據模型,使用註解的形式描述字段校驗的規則,我們以 Student 對象爲例爲大家演示如何使用。
首先在 WebController 添加一個保存的方法 saveStudent,參數爲 Student。
@RequestMapping("/saveStudent")
public void saveUser(@Valid Student student,BindingResult result) {
System.out.println("student:" + student);
if(result.hasErrors()) {
List<ObjectError> list = result.getAllErrors();
for (ObjectError error : list) {
System.out.println(error.getCode()+ "-" + error.getDefaultMessage());
}
}
}
- @Valid 參數前面添加 @Valid 註解,代表此對象使用了參數校驗;
- BindingResult參數校驗的結果會存儲在此對象中,可以根據屬性判斷是否校驗通過,校驗不通過可以將錯誤信息打印出來。
接下來在 User 中給需要校驗的參數添加對應的註解,對不同的屬性,按照規則添加不同的校驗內容。
public class Student {
@NotEmpty(message="姓名不能爲空")
private String name;
@Max(value = 100, message = "年齡不能大於100歲")
@Min(value= 18 ,message= "必須年滿18歲!" )
private int age;
@NotEmpty(message="密碼不能爲空")
@Length(min=6,message="密碼長度不能小於6位")
private String password;
//...
}
其中,message=“密碼不能爲空”,爲自定義返回的錯誤信息。
使用 MockMvc 進行一個測試:
@Test
public void saveStudents() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.post("/saveStudent")
.param("name","")
.param("age","101")
.param("password","test")
);
}
結果返回:
user:name=,age=666,pass=test
Max-年齡不能大於100歲
Length-密碼長度不能小於6位
NotEmpty-姓名不能爲空
結果顯示均已經觸發了校驗規則,返回了錯誤信息,在實際使用過程中可以對錯誤信息進行封裝,最後返回到前端進行展示。
常見校驗:
註解 | 應用 | 檢查項 |
---|---|---|
@Length(min=, max=) | String | 檢查字符串長度是否符合範圍 |
@Max(value=) | 以 numeric 或者 string 類型來表示一個數字 | 檢查值是否小於或等於最大值 |
@Min(value=) | 以 numeric 或者 string 類型來表示一個數字 | 檢查值是否大於或等於最小值 |
@NotNull | 屬性 | 檢查值是否非空(not null) |
@Past | date 或 calendar | 檢查日期是否是過去時 |
@Future | date 或 calendar | 檢查日期是否是將來時 |
@Pattern(regex=“regexp”, flag=) | String | 檢查屬性是否與給定匹配標誌的正則表達式相匹配 |
@Range(min=, max=) | 以 numeric 或者 String 類型來表示一個數字 | 檢查值是否在最小和最大值之間(包括臨界值) |
@Size(min=, max=) | array,collection,map | 檢查元素大小是否在最小和最大值之間(包括臨界值) |
@AssertFalse | 屬性 | 檢查方法的演算結果是否爲 false(對以代碼方式而不是註解表示的約束很有用) |
@AssertTrue | 屬性 | 檢查方法的演算結果是否爲 true(對以代碼方式而不是註解表示的約束很有用) |
@Valid | 屬性(object) | 對關聯對象遞歸進行驗證。如果對象是集合或數組,就遞歸地驗證其元素;如果對象是 Map,則遞歸驗證其值元素 |
String | 檢查字符串是否符合有效的 email 地址規範 |