Spring/SpringBoot參數校驗

參數校驗

數據的校驗的重要性就不用說了,即使在前端對數據進行校驗的情況下,我們還是要對傳入後端的數據再進行一遍校驗,避免用戶繞過瀏覽器直接通過一些 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註解
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章