參數校驗
數據的校驗的重要性就不用說了,即使在前端對數據進行校驗的情況下,我們還是要對傳入後端的數據再進行一遍校驗,避免用戶繞過瀏覽器直接通過一些 HTTP 工具直接向後端請求一些違法數據
JSR(Java Specification Requests) 是一套 JavaBean 參數校驗的標準,它定義了很多常用的校驗註解,我們可以直接將這些註解加在我們 JavaBean 的屬性上面,這樣就可以在需要校驗的時候進行校驗了,非常方便!
校驗的時候我們實際用的是 Hibernate Validator 框架。Hibernate Validator 是 Hibernate 團隊最初的數據校驗框架,Hibernate Validator 4.x 是 Bean Validation 1.0(JSR 303)的參考實現,Hibernate Validator 5.x 是 Bean Validation 1.1(JSR 349)的參考實現,目前最新版的 Hibernate Validator 6.x 是 Bean Validation 2.0(JSR 380)的參考實現。
SpringBoot 項目的 spring-boot-starter-web 依賴中已經有 hibernate-validator 包,不需要引用相關依賴。如下圖所示(通過 idea 插件—Maven Helper 生成)
需要注意的是: 所有的註解,推薦使用 JSR 註解,即javax.validation.constraints,而不是org.hibernate.validator.constraints
一些常用的字段驗證的註解
@NotEmpty
被註釋的字符串的不能爲 null 也不能爲空@NotBlank
被註釋的字符串非 null,並且必須包含一個非空白字符@Null
被註釋的元素必須爲 null@NotNull
被註釋的元素必須不爲 null@AssertTrue
被註釋的元素必須爲 true@AssertFalse
被註釋的元素必須爲 false@Pattern(regex=,flag=)
被註釋的元素必須符合指定的正則表達式@Email
被註釋的元素必須是 Email 格式。@Min(value)
被註釋的元素必須是一個數字,其值必須大於等於指定的最小值@Max(value)
被註釋的元素必須是一個數字,其值必須小於等於指定的最大值@DecimalMin(value)
被註釋的元素必須是一個數字,其值必須大於等於指定的最小值@DecimalMax(value)
被註釋的元素必須是一個數字,其值必須小於等於指定的最大值@Size(max=, min=)
被註釋的元素的大小必須在指定的範圍內@Digits (integer, fraction)
被註釋的元素必須是一個數字,其值必須在可接受的範圍內@Past
被註釋的元素必須是一個過去的日期@Future
被註釋的元素必須是一個將來的日期
驗證請求體(RequestBody)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
@NotNull(message = "classId 不能爲空")
private String classId;
@Size(max = 33)
@NotNull(message = "name 不能爲空")
private String name;
@Pattern(regexp = "((^Man$|^Woman$|^UGM$))", message = "sex 值不在可選範圍")
@NotNull(message = "sex 不能爲空")
private String sex;
@Email(message = "email 格式不正確")
@NotNull(message = "email 不能爲空")
private String email;
}
// 我們在需要驗證的參數上加上了@Valid註解,如果驗證失敗,它將拋出MethodArgumentNotValidException。
@RestController
@RequestMapping("/api")
public class PersonController {
@PostMapping("/person")
public ResponseEntity<Person> getPerson(@RequestBody @Valid Person person) {
return ResponseEntity.ok().body(person);
}
}
驗證請求參數(Path Variables 和 Request Parameters)
一定一定不要忘記在類上加上 Validated 註解了,這個參數可以告訴 Spring 去校驗方法參數。
@RestController
@RequestMapping("/api")
@Validated
public class PersonController {
@GetMapping("/person/{id}")
public ResponseEntity<Integer> getPersonByID(@Valid @PathVariable("id") @Max(value = 5,message = "超過 id 的範圍了") Integer id) {
return ResponseEntity.ok().body(id);
}
}
嵌套對象的校驗
public class Person{
@Valid
private Student student;
@Size(min=1,max=10)
private List<@Valid Student> student;
}
public class Student{
@NotNull("年齡不能爲空")
private int age;
@NotBlank(message="名稱不能爲空")
private String name;
}
- 在一個對象中嵌套了另一個對象或對象集合,則要在對象屬性上添加@valid註解