最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Spring中@Valid和@Validated注解用法

 更新時(shí)間:2022年07月21日 17:17:32   作者:zyqok  
本文將以新增一個(gè)員工為功能切入點(diǎn),以常規(guī)寫(xiě)法為背景,慢慢烘托出?@Valid?和?@Validated?注解用法詳解,文中的示例代碼講解詳細(xì),感興趣的可以了解一下

案例引入

下面我們以新增一個(gè)員工為功能切入點(diǎn),以常規(guī)寫(xiě)法為背景,慢慢烘托出 @Valid 和 @Validated 注解用法詳解。

那么,首先,我們會(huì)有一個(gè)員工對(duì)象 Employee,如下 :

/**
 * 員工對(duì)象
 * 
 * @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 中會(huì)有一個(gè)對(duì)應(yīng)都新增方法 add(),如下:

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

現(xiàn)在要求:?jiǎn)T工的名稱不能為空,且長(zhǎng)度不能超過(guò)10個(gè)字符,那么我們以前的做法大致如下:

寫(xiě)完,我們啟動(dòng)項(xiàng)目測(cè)試下:

(1)名稱為空情況

(2)正常情況

(3)超過(guò)長(zhǎng)度情況

可以看到,和我們料想中的一樣,毫無(wú)問(wèn)題。

除了名稱外,我們規(guī)定年齡也是必填項(xiàng),且范圍在1到100歲,那么此時(shí),我們需要增加對(duì)應(yīng)判定代碼如下:

那么問(wèn)題來(lái)了,現(xiàn)在員工對(duì)象 Employee 就 2 個(gè)字段,我們就寫(xiě)了 10 多行的代碼驗(yàn)證,要是有20個(gè)字段,豈不是要寫(xiě) 100 多行代碼?通常來(lái)說(shuō),當(dāng)一個(gè)方法中的無(wú)效業(yè)務(wù)代碼量過(guò)多時(shí),往往代碼設(shè)計(jì)有問(wèn)題,當(dāng)然這不是我們所想看到都結(jié)果。

那么如何解決呢?首先大家應(yīng)該會(huì)想到將對(duì)應(yīng)的驗(yàn)證過(guò)程抽成一個(gè)驗(yàn)證方法,如下:

這樣來(lái)看,我們的業(yè)務(wù)方法就清爽多了。

但這種方式只是抽了一個(gè)方法,有一種換湯不換藥的感覺(jué),雖然業(yè)務(wù)方法看起來(lái)清爽了很多,但書(shū)寫(xiě)代碼量并沒(méi)有下降,反而還多出了一個(gè)方法,這也不是我們理想中的樣子。

@Valid 詳解

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

首先,我們?cè)?Maven 配置中引入 @valid 的依賴:

如果你是 springboot 項(xiàng)目,那么可以不用引入了,已經(jīng)引入了,他就存在于最核心的 web 開(kāi)發(fā)包里面。

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

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

<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>

那么針對(duì)上面情景,我們可以對(duì)我們的代碼進(jìn)行優(yōu)化了。

首先我們?cè)?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;
 
/**
 * 員工對(duì)象
 * 
 * @author sunnyzyq
 * @since 2019/12/13
 */
public class Employee {
 
    /** 姓名 */
    @NotBlank(message = "請(qǐng)輸入名稱")
    @Length(message = "名稱不能超過(guò)個(gè) {max} 字符", max = 10)
    public String name;
 
    /** 年齡 */
    @NotNull(message = "請(qǐng)輸入年齡")
    @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 對(duì)應(yīng)方法上,對(duì)這個(gè)員工標(biāo)上 @Valid 注解,表示我們對(duì)這個(gè)對(duì)象屬性需要進(jìn)行驗(yàn)證,

既然驗(yàn)證,那么就肯定會(huì)有驗(yàn)證結(jié)果,所以我們需要用一個(gè)東西來(lái)存放驗(yàn)證結(jié)果,做法也很簡(jiǎn)單,在參數(shù)直接添加一個(gè)BindingResult,具體如下:

對(duì)應(yīng)獲取驗(yàn)證結(jié)果的代碼如下:

OK ! 萬(wàn)事俱備 !我們進(jìn)行測(cè)試下:

(1)名稱為空

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

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

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

可以看到,代碼不但簡(jiǎn)潔了很多,結(jié)果和預(yù)期的也一模一樣!很棒吧??!

常用注解:

除了剛剛都注解,最后再附加2個(gè)常用注解,我就直接貼圖了,基本上這6個(gè)注解可以解決99%的字段,其他注解我就不貼圖了,如果不滿足,自己?jiǎn)柊俣取?/strong>

@Validated 詳解

上面,我們講述了 @Valid 注解,現(xiàn)在我們來(lái)說(shuō)說(shuō) @Validated 這個(gè)注解,在我看來(lái),@Validated 是在 @Valid 基礎(chǔ)上,做的一個(gè)升級(jí)版。

我們可以看到,我們?cè)谑褂?@Valid 進(jìn)行驗(yàn)證的時(shí)候,我們需要用一個(gè)對(duì)象去接收校驗(yàn)結(jié)果,最后根據(jù)校驗(yàn)結(jié)果判斷,從而提示用戶。

如果我們把手動(dòng)校驗(yàn)的這段代碼刪除或注釋掉,那么即使當(dāng)我們的字段不滿足規(guī)則時(shí),方法種的程序也是能夠被執(zhí)行的。

比如,我們將字段值置空時(shí),正常情況是會(huì)進(jìn)行提示的。

 當(dāng)我們把校驗(yàn)邏輯注釋掉后,再次執(zhí)行上面的請(qǐng)求后。

可以看到我們的程序繼續(xù)往后面去執(zhí)行完成了。 

現(xiàn)在,我們?nèi)サ舴椒▍?shù)上的 @Valid 注解和其配對(duì)的 BindingResult 對(duì)象,

然后再校驗(yàn)的對(duì)象前面添加上 @Validated 注解。

這個(gè)時(shí)候,我們?cè)俅握?qǐng)求,可以看到,我們請(qǐng)求報(bào)400錯(cuò)誤了。

而我們通過(guò)程序的異常日志來(lái)看,提示說(shuō)是 age 和 name 字段為了空,致使請(qǐng)求失敗。

那么,從這里我們可以得知,當(dāng)我們的數(shù)據(jù)存在校驗(yàn)不通過(guò)的時(shí)候,程序就會(huì)拋出

org.springframework.validation.BindException 的異常。

在實(shí)際開(kāi)發(fā)的過(guò)程中,我們肯定不能講異常直接展示給用戶,而是給能看懂的提示。

于是,我們不妨可以通過(guò)捕獲異常的方式,將該異常進(jìn)行捕獲。

首先我們創(chuàng)建一個(gè)校驗(yàn)異常捕獲類 ValidExceptionHandler ,然后打上 @RestControllerAdvice 注解,該注解表示他會(huì)去抓所有 @Controller 標(biāo)記類的異常,并在異常處理后返回以 JSON 或字符串的格式響應(yīng)前端。

算了,我直接將這段代碼貼出來(lái)吧。

在異常捕捉到后,我們同上面的 @valid 校驗(yàn)一樣,只返回第一個(gè)錯(cuò)誤提示。

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();
    }
 
}

那么,我們現(xiàn)在重啟程序,然后重新請(qǐng)求,就可以發(fā)現(xiàn)界面已經(jīng)不報(bào)400錯(cuò)誤了,而是直接提示了我們的錯(cuò)誤信息。

@Valid 和 @Validated 比較

最后我們來(lái)對(duì) @Valid 和 @Validated 兩個(gè)注解進(jìn)行總結(jié)下:

(1)@Valid 和 @Validated 兩者都可以對(duì)數(shù)據(jù)進(jìn)行校驗(yàn),待校驗(yàn)字段上打的規(guī)則注解(@NotNull, @NotEmpty等)都可以對(duì) @Valid 和 @Validated 生效;

(2)@Valid 進(jìn)行校驗(yàn)的時(shí)候,需要用 BindingResult 來(lái)做一個(gè)校驗(yàn)結(jié)果接收。當(dāng)校驗(yàn)不通過(guò)的時(shí)候,如果手動(dòng)不 return ,則并不會(huì)阻止程序的執(zhí)行;

(3)@Validated 進(jìn)行校驗(yàn)的時(shí)候,當(dāng)校驗(yàn)不通過(guò)的時(shí)候,程序會(huì)拋出400異常,阻止方法中的代碼執(zhí)行,這時(shí)需要再寫(xiě)一個(gè)全局校驗(yàn)異常捕獲處理類,然后返回校驗(yàn)提示。

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

到此這篇關(guān)于詳解Spring中@Valid和@Validated注解用法的文章就介紹到這了,更多相關(guān)Spring @Valid @Validated內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中的AQS框架原理詳解

    Java中的AQS框架原理詳解

    這篇文章主要介紹了Java中的AQS框架原理詳解,AQS核心思想是,如果被請(qǐng)求的共享資源(state)空閑,則將當(dāng)前請(qǐng)求資源的線程設(shè)置為有效的工作線程,并且將共享資源設(shè)置為鎖定狀態(tài),需要的朋友可以參考下
    2023-12-12
  • Java基本數(shù)據(jù)類型與對(duì)應(yīng)的包裝類(動(dòng)力節(jié)點(diǎn)java學(xué)院整理)

    Java基本數(shù)據(jù)類型與對(duì)應(yīng)的包裝類(動(dòng)力節(jié)點(diǎn)java學(xué)院整理)

    Java是面向?qū)ο蟮木幊陶Z(yǔ)言,包裝類的出現(xiàn)更好的體現(xiàn)這一思想,Java語(yǔ)言提供了八種基本類型。六種數(shù)字類型(四個(gè)整數(shù)型,兩個(gè)浮點(diǎn)型),一種字符類型,還有一種布爾型。 下面通過(guò)本文給大家詳細(xì)介紹,感興趣的朋友一起學(xué)習(xí)吧
    2017-04-04
  • 使用注解解決ShardingJdbc不支持復(fù)雜SQL方法

    使用注解解決ShardingJdbc不支持復(fù)雜SQL方法

    這篇文章主要為大家介紹了使用注解解決ShardingJdbc不支持復(fù)雜SQL方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Java實(shí)現(xiàn)MD5消息摘要算法

    Java實(shí)現(xiàn)MD5消息摘要算法

    本篇文章主要介紹了Java實(shí)現(xiàn)MD5消息摘要算法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • 關(guān)于SpringMVC的異常處理機(jī)制詳細(xì)解讀

    關(guān)于SpringMVC的異常處理機(jī)制詳細(xì)解讀

    這篇文章主要介紹了關(guān)于SpringMVC的異常處理機(jī)制詳細(xì)解讀,SpringMVC是目前主流的Web?MVC框架之一,本文將分析SpringMVC的異常處理內(nèi)容,需要的朋友可以參考下
    2023-05-05
  • 詳解Java高并發(fā)編程之AtomicReference

    詳解Java高并發(fā)編程之AtomicReference

    此篇文章主要介紹了AtomicReference的出現(xiàn)背景,AtomicReference的使用場(chǎng)景,以及介紹了AtomicReference的源碼,重點(diǎn)方法的源碼分析
    2021-06-06
  • Java編程實(shí)現(xiàn)快速排序及優(yōu)化代碼詳解

    Java編程實(shí)現(xiàn)快速排序及優(yōu)化代碼詳解

    這篇文章主要介紹了Java編程實(shí)現(xiàn)快速排序及優(yōu)化代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以了解下。
    2017-12-12
  • 通過(guò)實(shí)例了解Java Integer類和int的區(qū)別

    通過(guò)實(shí)例了解Java Integer類和int的區(qū)別

    這篇文章主要介紹了通過(guò)實(shí)例了解Java Integer類和int的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Spring?Boot源碼實(shí)現(xiàn)StopWatch優(yōu)雅統(tǒng)計(jì)耗時(shí)

    Spring?Boot源碼實(shí)現(xiàn)StopWatch優(yōu)雅統(tǒng)計(jì)耗時(shí)

    這篇文章主要為大家介紹了Spring?Boot源碼實(shí)現(xiàn)StopWatch優(yōu)雅統(tǒng)計(jì)耗時(shí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Java中Spring MVC接收表單數(shù)據(jù)的常用方法

    Java中Spring MVC接收表單數(shù)據(jù)的常用方法

    Spring MVC是Spring框架中的一個(gè)模塊,用于開(kāi)發(fā)基于MVC(Model-View-Controller)架構(gòu)的Web應(yīng)用程序,它提供了一種輕量級(jí)的、靈活的方式來(lái)構(gòu)建Web應(yīng)用,同時(shí)提供了豐富的功能和特性,本文給大家介紹了Spring MVC接收表單數(shù)據(jù)的方法,需要的朋友可以參考下
    2024-05-05

最新評(píng)論

宜州市| 百色市| 平乐县| 江门市| 芜湖县| 尼玛县| 汽车| 海宁市| 广西| 林西县| 鄂托克旗| 封开县| 虹口区| 安新县| 富源县| 陆良县| 攀枝花市| 清涧县| 榆林市| 尼玛县| 紫金县| 丰城市| 烟台市| 金寨县| 武安市| 墨竹工卡县| 商城县| 剑河县| 安阳市| 陆河县| 武清区| 天等县| 巴彦县| 师宗县| 云阳县| 德惠市| 古蔺县| 宁乡县| 家居| 巴东县| 闻喜县|