1. 程式人生 > >SpringBoot引數校驗機制之一:基本驗證概念

SpringBoot引數校驗機制之一:基本驗證概念

引言
在實際專案開發中,我們會對Controller層接收到的引數進行基本的校驗,本文主要介紹SpringBoot專案中使用註解對輸入引數進行初步規則校驗的方法。本文將從以下幾個方面進行闡述。

  • Rest請求方式
  • 校驗框架
  • 常用的引數校驗註解
  • 程式碼示例

一、Rest請求方式
在當下的WEB後臺開發模式下,基本都採用了前後臺分離的開放方式。所謂前後臺分離就是後臺給前段返回統一的JSON格式資料,前端通過解析JSON資料將後臺處理的資料展示在頁面。前端呼叫Rest風格的後臺介面。

  1. Get請求
    一般用於頁面展示資料的查詢操作,不涉及資料庫資料的變化。常用的Controller層註解為@GetMapping。

  2. POST請求
    提交資料到後臺服務,需要修改伺服器中的資料。提交的資料放在HTTP請求中的訊息體重。常用的Controller層註解為@PostMapping。

  3. DELETE請求
    主要通過HTTP請求刪除指定URL伺服器資源。常見返回的狀態碼包括:
    (1)200(OK):刪除成功,同時返回刪除的資源。
    (2)202 (Accepted) : 刪除請求已經接受,但沒有被立即執行。
    (3)204 (No Content) - 刪除請求已經被執行,但是沒有返回資源(也許是請求刪除不存在的資源造成的)。

  4. PUT請求
    主要用於通過HTTP請求的方式ge更改伺服器資源,常見的返回狀態碼包括:
    (1)200 (OK): 已存在資源被更改。
    (2)201 (created):如果新資源被建立。

二、校驗框架
在日常開發工作中,對於Controller層接收的引數進行校驗的時候可以通過程式碼來進行,但是這些校驗操作與具體的業務無關,可以通過抽象一個校驗工具類的方法實現,但是總會覺得這部分程式碼糅合在程式碼中顯得臃腫不實用。同時也不能保證驗證引數的有效性。Hibernate validator提供了一套基於註解的引數驗證機制,它可以與現有框架進行有機整合。spring-boot-starter-web包裡面有hibernate-validator包,不需要引用hibernate validator依賴,因為該包中已經包含了hibernate-validator包的引用。

<dependency
>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>

三、常用的引數校驗註解
以下表格是一些常用校驗註解的說明。

@Null 限制只能為null
@NotNull 限制必須不為null
@AssertFalse 限制必須為false
@AssertTrue 限制必須為true
@Max(value) 限制必須為一個不大於指定值的數字
@Min(value) 限制必須為一個不小於指定值的數字
@NotBlank 驗證註解的元素值不為空(不為null、去除首位空格後長度為0),不同於@NotEmpty,@NotBlank只應用於字串且在比較時會去除字串的空格
@NotEmpty 驗證註解的元素值不為null且不為空(字串長度不為0、集合大小不為0)
@Email 驗證註解的元素值是Email,也可以通過正則表示式和flag指定自定義的email格式
@Range 驗證欄位的範圍,最小值到最大值

四、程式碼示例

public class StudentDto {

    @NotNull(message = "field is null")
    private String name;

    @NotNull(message = "field is null")
    @Max(100)
    private int age;

    @NotNull(message = "field is null")
    private boolean sexuality;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public boolean isSexuality() {
        return sexuality;
    }

    public void setSexuality(boolean sexuality) {
        this.sexuality = sexuality;
    }

}