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

參數(shù)校驗(yàn)Spring的@Valid注解用法解析

 更新時(shí)間:2021年08月04日 15:36:54   作者:JavaEdge.  
這篇文章主要介紹了參數(shù)校驗(yàn)Spring的@Valid注解用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

參數(shù)校驗(yàn)Spring的@Valid注解

@Valid 注解通常用于對(duì)象屬性字段的規(guī)則檢測(cè)。

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

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

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ù)庫
        return "新增員工成功";
    } 
}

需求變更,要求員工名稱不能為空,且長度不超過10個(gè)字符

我們的原始寫法:

現(xiàn)在規(guī)定年齡也是必填項(xiàng),且范圍在1到100歲,那么此時(shí),我們需要增加判定

現(xiàn)在員工對(duì)象 Employee 就 2 個(gè)字段,我們就寫了 10 多行的代碼驗(yàn)證,要是有20個(gè)字段,豈不是要寫 100 多行代碼?

如何解決呢?

將驗(yàn)證過程抽成一個(gè)驗(yàn)證方法:

但這種方式只是抽了一個(gè)方法,有一種換湯不換藥的感覺,雖然業(yè)務(wù)方法看起來清爽了很多,但書寫代碼量并沒有下降,反而還多出了一個(gè)方法。

此時(shí)引出 Spring 的 @valid 注解即可:

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

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

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

代碼優(yōu)化

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

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; 
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
public class Employee {
 
    /** 姓名 */
    @NotBlank(message = "請(qǐng)輸入名稱")
    @Length(message = "名稱不能超過個(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)證

用一個(gè)東西來存放驗(yàn)證結(jié)果,做法也很簡(jiǎn)單,在參數(shù)直接添加一個(gè)BindingResult:

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

@Valid與@Validated注解

之前項(xiàng)目中參數(shù)的校驗(yàn),都是自己寫的判斷方法進(jìn)行校驗(yàn),這次采用了spring提供的注解進(jìn)行參數(shù)的校驗(yàn),更為的方便,簡(jiǎn)潔。

@Valid:常見用在方法,類中字段上進(jìn)行校驗(yàn)

@Validated:是spring提供的對(duì)@Valid的封裝,常見用在方法上進(jìn)行校驗(yàn)

定義的校驗(yàn)類型

@Null 驗(yàn)證對(duì)象是否為null

@NotNull 驗(yàn)證對(duì)象是否不為null, 無法查檢長度為0的字符串

@NotBlank 檢查約束字符串是不是Null還有被Trim的長度是否大于0,只對(duì)字符串,且會(huì)去掉前后空格.

@NotEmpty 檢查約束元素是否為NULL或者是EMPTY.

@CreditCardNumber信用卡驗(yàn)證

@Email 驗(yàn)證是否是郵件地址,如果為null,不進(jìn)行驗(yàn)證,算通過驗(yàn)證。

@URL(protocol=,host=, port=,regexp=, flags=) ip地址校驗(yàn)

Booelan檢查

@AssertTrue 驗(yàn)證 Boolean 對(duì)象是否為 true

@AssertFalse 驗(yàn)證 Boolean 對(duì)象是否為 false

長度檢查

@Size(min=, max=) 驗(yàn)證對(duì)象(Array,Collection,Map,String)長度是否在給定的范圍之內(nèi)

@Length(min=, max=) Validates that the annotated string is between min and max included.

日期檢查

@Past 驗(yàn)證 Date 和 Calendar 對(duì)象是否在當(dāng)前時(shí)間之前

@Future 驗(yàn)證 Date 和 Calendar 對(duì)象是否在當(dāng)前時(shí)間之后

@Pattern 驗(yàn)證 String 對(duì)象是否符合正則表達(dá)式的規(guī)則

數(shù)值檢查,建議使用在Stirng,Integer類型,不建議使用在int類型上,因?yàn)楸韱沃禐?"時(shí)無法轉(zhuǎn)換為int,但可以轉(zhuǎn)換為Stirng為"",Integer為null

@Min 驗(yàn)證 Number 和 String 對(duì)象是否大等于指定的值

@Max 驗(yàn)證 Number 和 String 對(duì)象是否小等于指定的值

@DecimalMax 被標(biāo)注的值必須不大于約束中指定的最大值. 這個(gè)約束的參數(shù)是一個(gè)通過BigDecimal定義的最大值的字符串表示.小數(shù)存在精度

@DecimalMin 被標(biāo)注的值必須不小于約束中指定的最小值. 這個(gè)約束的參數(shù)是一個(gè)通過BigDecimal定義的最小值的字符串表示.小數(shù)存在精度

@Digits 驗(yàn)證 Number 和 String 的構(gòu)成是否合法

@Digits(integer=,fraction=) 驗(yàn)證字符串是否是符合指定格式的數(shù)字,interger指定整數(shù)精度,fraction指定小數(shù)精度。

@Range(min=, max=) Checks whether the annotated value lies between (inclusive) the specified minimum and maximum.

注意的幾點(diǎn):

(1)如果一個(gè)bean中包含第二個(gè)bean

這時(shí)要檢驗(yàn)第二個(gè)bean中某個(gè)字段,即嵌套校驗(yàn),必須要在第一個(gè)bean對(duì)象中使用@Valid標(biāo)注到表示第二個(gè)bean對(duì)象的字段上,然后再第二個(gè)bean對(duì)象里面的字段上加上校驗(yàn)類型

(2)@Validated支持分組注解

1、先定義一個(gè)空接口:GroupA

2、對(duì)bean對(duì)象中校驗(yàn)類型,添加分組信息,這里我對(duì)version字段進(jìn)行了分組校驗(yàn)信息添加

3、方法入?yún)⒅羞M(jìn)行分組信息添加

如上圖所示,則shelveProject方法由于添加了分組信息會(huì)校驗(yàn)DeleteProjectRequest對(duì)象中的version字段是否為空,而offShelveProject方法沒有添加分組信息,不會(huì)校驗(yàn)version是否為空。

@Validated沒有添加groups屬性時(shí),默認(rèn)驗(yàn)證沒有分組的驗(yàn)證屬性。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java 中的 String對(duì)象為什么是不可變的

    Java 中的 String對(duì)象為什么是不可變的

    String對(duì)象是不可變的,但這僅意味著你無法通過調(diào)用它的公有方法來改變它的值。本文給大家介紹java中的string對(duì)象為什么是不可變的,需要的朋友一起了解了解吧
    2015-10-10
  • java中線程的sleep()方法和yield()方法的區(qū)別

    java中線程的sleep()方法和yield()方法的區(qū)別

    本文主要介紹了java中線程的sleep()方法和yield()方法的區(qū)別,Thread類的sleep()方法使線程休眠指定時(shí)間,不釋放鎖,而yield()提示調(diào)度器當(dāng)前線程愿意讓出CPU資源,不保證立即切換線程,感興趣的可以了解一下
    2024-10-10
  • SpringBoot實(shí)現(xiàn)獲取客戶端IP地理位置

    SpringBoot實(shí)現(xiàn)獲取客戶端IP地理位置

    在當(dāng)今互聯(lián)的世界中,了解客戶端的地理位置對(duì)于提供個(gè)性化服務(wù)和增強(qiáng)用戶體驗(yàn)至關(guān)重要,使用本文為大家介紹了SpringBoot獲取客戶端IP地理位置的相關(guān)方法,需要的小伙伴可以參考下
    2023-11-11
  • hadoop之MapReduce框架原理

    hadoop之MapReduce框架原理

    這篇文章主要介紹了hadoop的MapReduce框架原理,MapReduce是分為兩個(gè)階段的,MapperTask階段,和ReduceTask階段。如果有感興趣的小伙伴可以借鑒參考
    2023-03-03
  • Java 按照字節(jié)來截取字符串的代碼(不會(huì)出現(xiàn)半個(gè)漢字)

    Java 按照字節(jié)來截取字符串的代碼(不會(huì)出現(xiàn)半個(gè)漢字)

    Java 按照字節(jié)來截取字符串的工具,不會(huì)出現(xiàn)半個(gè)漢字。一個(gè)中文兩個(gè)字節(jié),一個(gè)英文字符只占 1 個(gè)字節(jié)** 1. 通常我們用于前端顯示的時(shí)候,防止標(biāo)題過長
    2014-01-01
  • java如何根據(jù)時(shí)間戳生成有序ID

    java如何根據(jù)時(shí)間戳生成有序ID

    這篇文章主要介紹了java如何根據(jù)時(shí)間戳生成有序ID問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • spring本地事務(wù)失效的原因分析

    spring本地事務(wù)失效的原因分析

    這篇文章給大家介紹了spring本地事務(wù)失效的情況原因分析,給大家羅列了五種原因分析,通過代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-10-10
  • 在Springboot中Mybatis與Mybatis-plus的區(qū)別詳解

    在Springboot中Mybatis與Mybatis-plus的區(qū)別詳解

    MyBatis是一個(gè)優(yōu)秀的持久層框架,它對(duì)JDBC的操作數(shù)據(jù)庫的過程進(jìn)行封裝,MyBatisPlus (簡(jiǎn)稱 MP)是一個(gè) MyBatis的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開發(fā)、提高效率而生,本文將給大家介紹了在Springboot中Mybatis與Mybatis-plus的區(qū)別
    2023-12-12
  • Java SpringBoot自定義starter詳解

    Java SpringBoot自定義starter詳解

    大家好,本篇文章主要講的是Java SpringBoot自定義starter詳解,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次
    2022-01-01
  • 基于JavaBean編輯器讀取peroperties文件的實(shí)例

    基于JavaBean編輯器讀取peroperties文件的實(shí)例

    下面小編就為大家?guī)硪黄贘avaBean編輯器讀取peroperties文件的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10

最新評(píng)論

体育| 奎屯市| 聂拉木县| 兴安县| 定兴县| 北辰区| 循化| 西和县| 阳新县| 革吉县| 安西县| 博客| 色达县| 泾川县| 自治县| 祥云县| 曲松县| 盐津县| 攀枝花市| 长治县| 平塘县| 巫山县| 河津市| 广元市| 襄垣县| 沾化县| 五大连池市| 抚宁县| 九江县| 怀仁县| 新郑市| 鄂尔多斯市| 遵义县| 罗城| 安岳县| 澜沧| 勃利县| 林州市| 花垣县| 建平县| 蚌埠市|