中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring中@Valid和@Validated注解怎么使用

發布時間:2022-07-22 09:33:20 來源:億速云 閱讀:151 作者:iii 欄目:開發技術

本篇內容主要講解“Spring中@Valid和@Validated注解怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Spring中@Valid和@Validated注解怎么使用”吧!

案例引入

下面我們以新增一個員工為功能切入點,以常規寫法為背景,慢慢烘托出 @Valid 和 @Validated 注解用法詳解。

那么,首先,我們會有一個員工對象 Employee,如下 :

/**
 * 員工對象
 * 
 * @author sunnyzyq
 * @since 2019/12/13
 */
public class Employee {
 
    /** 姓名 */
    public String name;
 
    /** 年齡 */
    public Integer age;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Integer getAge() {
        return age;
    }
 
    public void setAge(Integer age) {
        this.age = age;
    }
 
}

然后 Cotroller 中會有一個對應都新增方法 add(),如下:

@Controller
public class TestController {
 
    @RequestMapping("/add")
    @ResponseBody
    public String add(Employee employee) {
        // TODO 保存到數據庫
        return "新增員工成功";
    }
 
}

現在要求:員工的名稱不能為空,且長度不能超過10個字符,那么我們以前的做法大致如下:

Spring中@Valid和@Validated注解怎么使用

寫完,我們啟動項目測試下:

(1)名稱為空情況

Spring中@Valid和@Validated注解怎么使用

(2)正常情況

Spring中@Valid和@Validated注解怎么使用

(3)超過長度情況

Spring中@Valid和@Validated注解怎么使用

可以看到,和我們料想中的一樣,毫無問題。

除了名稱外,我們規定年齡也是必填項,且范圍在1到100歲,那么此時,我們需要增加對應判定代碼如下:

Spring中@Valid和@Validated注解怎么使用

那么問題來了,現在員工對象 Employee 就 2 個字段,我們就寫了 10 多行的代碼驗證,要是有20個字段,豈不是要寫 100 多行代碼?通常來說,當一個方法中的無效業務代碼量過多時,往往代碼設計有問題,當然這不是我們所想看到都結果。

那么如何解決呢?首先大家應該會想到將對應的驗證過程抽成一個驗證方法,如下:

這樣來看,我們的業務方法就清爽多了。

Spring中@Valid和@Validated注解怎么使用

但這種方式只是抽了一個方法,有一種換湯不換藥的感覺,雖然業務方法看起來清爽了很多,但書寫代碼量并沒有下降,反而還多出了一個方法,這也不是我們理想中的樣子。

@Valid 詳解

此時,我們引出 Spring 中的 @valid 注解,這些問題就可以迎刃而解了,具體如下:

首先,我們在 Maven 配置中引入 @valid 的依賴:

如果你是 springboot 項目,那么可以不用引入了,已經引入了,他就存在于最核心的 web 開發包里面。

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

如果你不是 springboot 項目,那么引入下面依賴即可:

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>
 
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.4.1.Final</version>
</dependency>

那么針對上面情景,我們可以對我們的代碼進行優化了。

首先我們在 Employee 類的屬性上打上如下注解:

package com.zyq.beans;
 
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
 
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
 
/**
 * 員工對象
 * 
 * @author sunnyzyq
 * @since 2019/12/13
 */
public class Employee {
 
    /** 姓名 */
    @NotBlank(message = "請輸入名稱")
    @Length(message = "名稱不能超過個 {max} 字符", max = 10)
    public String name;
 
    /** 年齡 */
    @NotNull(message = "請輸入年齡")
    @Range(message = "年齡范圍為 {min} 到 {max} 之間", min = 1, max = 100)
    public Integer age;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Integer getAge() {
        return age;
    }
 
    public void setAge(Integer age) {
        this.age = age;
    }
 
}

然后再 Controller 對應方法上,對這個員工標上 @Valid 注解,表示我們對這個對象屬性需要進行驗證,

Spring中@Valid和@Validated注解怎么使用

既然驗證,那么就肯定會有驗證結果,所以我們需要用一個東西來存放驗證結果,做法也很簡單,在參數直接添加一個BindingResult,具體如下:

Spring中@Valid和@Validated注解怎么使用

對應獲取驗證結果的代碼如下:

Spring中@Valid和@Validated注解怎么使用

OK ! 萬事俱備 !我們進行測試下:

(1)名稱為空

Spring中@Valid和@Validated注解怎么使用

(2)名稱正常,年齡為空

Spring中@Valid和@Validated注解怎么使用

(3)名稱超出范圍,年齡正常

Spring中@Valid和@Validated注解怎么使用

(4)名稱正常,年齡超出范圍

Spring中@Valid和@Validated注解怎么使用

可以看到,代碼不但簡潔了很多,結果和預期的也一模一樣!很棒吧!!

常用注解:

除了剛剛都注解,最后再附加2個常用注解,我就直接貼圖了,基本上這6個注解可以解決99%的字段,其他注解我就不貼圖了,如果不滿足,自己問百度。

Spring中@Valid和@Validated注解怎么使用

@Validated 詳解

上面,我們講述了 @Valid 注解,現在我們來說說 @Validated 這個注解,在我看來,@Validated 是在 @Valid 基礎上,做的一個升級版。

我們可以看到,我們在使用 @Valid 進行驗證的時候,我們需要用一個對象去接收校驗結果,最后根據校驗結果判斷,從而提示用戶。

Spring中@Valid和@Validated注解怎么使用

如果我們把手動校驗的這段代碼刪除或注釋掉,那么即使當我們的字段不滿足規則時,方法種的程序也是能夠被執行的。

比如,我們將字段值置空時,正常情況是會進行提示的。

Spring中@Valid和@Validated注解怎么使用

 當我們把校驗邏輯注釋掉后,再次執行上面的請求后。

Spring中@Valid和@Validated注解怎么使用

可以看到我們的程序繼續往后面去執行完成了。 

Spring中@Valid和@Validated注解怎么使用

現在,我們去掉方法參數上的 @Valid 注解和其配對的 BindingResult 對象,

然后再校驗的對象前面添加上 @Validated 注解。

Spring中@Valid和@Validated注解怎么使用

這個時候,我們再次請求,可以看到,我們請求報400錯誤了。

Spring中@Valid和@Validated注解怎么使用

而我們通過程序的異常日志來看,提示說是 age 和 name 字段為了空,致使請求失敗。

Spring中@Valid和@Validated注解怎么使用

那么,從這里我們可以得知,當我們的數據存在校驗不通過的時候,程序就會拋出

org.springframework.validation.BindException 的異常。

在實際開發的過程中,我們肯定不能講異常直接展示給用戶,而是給能看懂的提示。

于是,我們不妨可以通過捕獲異常的方式,將該異常進行捕獲。

首先我們創建一個校驗異常捕獲類 ValidExceptionHandler ,然后打上 @RestControllerAdvice 注解,該注解表示他會去抓所有 @Controller 標記類的異常,并在異常處理后返回以 JSON 或字符串的格式響應前端。

Spring中@Valid和@Validated注解怎么使用

算了,我直接將這段代碼貼出來吧。

在異常捕捉到后,我們同上面的 @valid 校驗一樣,只返回第一個錯誤提示。

package com.zyq.config;
 
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
 
@RestControllerAdvice
public class ValidExceptionHandler {
 
    @ExceptionHandler(BindException.class)
    public String validExceptionHandler(BindException exception) {
        return exception.getAllErrors().get(0).getDefaultMessage();
    }
 
}

那么,我們現在重啟程序,然后重新請求,就可以發現界面已經不報400錯誤了,而是直接提示了我們的錯誤信息。

Spring中@Valid和@Validated注解怎么使用

@Valid 和 @Validated 比較

最后我們來對 @Valid 和 @Validated 兩個注解進行總結下:

(1)@Valid 和 @Validated 兩者都可以對數據進行校驗,待校驗字段上打的規則注解(@NotNull, @NotEmpty等)都可以對 @Valid 和 @Validated 生效;

(2)@Valid 進行校驗的時候,需要用 BindingResult 來做一個校驗結果接收。當校驗不通過的時候,如果手動不 return ,則并不會阻止程序的執行;

(3)@Validated 進行校驗的時候,當校驗不通過的時候,程序會拋出400異常,阻止方法中的代碼執行,這時需要再寫一個全局校驗異常捕獲處理類,然后返回校驗提示。

(4)總體來說,@Validated 使用起來要比 @Valid 方便一些,它可以幫我們節省一定的代碼,并且使得方法看上去更加的簡潔。

到此,相信大家對“Spring中@Valid和@Validated注解怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永顺县| 沐川县| 江华| 金川县| 顺平县| 凤庆县| 兰西县| 石首市| 柳江县| 乌拉特后旗| 昭苏县| 灵宝市| 邯郸县| 清丰县| 罗江县| 通州市| 江孜县| 泗水县| 酉阳| 石嘴山市| 郓城县| 文安县| 南康市| 壤塘县| 宜兰市| 理塘县| 通道| 正镶白旗| 高密市| 观塘区| 静乐县| 宁远县| 始兴县| 樟树市| 驻马店市| 临潭县| 天峨县| 普安县| 中西区| 宜宾市| SHOW|