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

spring?參數(shù)校驗(yàn)Validation示例詳解

 更新時(shí)間:2024年12月30日 11:59:17   作者:初晴~  
Spring提供了Validation工具類來(lái)實(shí)現(xiàn)對(duì)客戶端傳來(lái)的請(qǐng)求參數(shù)的有效校驗(yàn),本文給大家介紹spring?參數(shù)校驗(yàn)Validation示例詳解,感興趣的朋友一起看看吧

前言

在實(shí)際開(kāi)發(fā)中,我們無(wú)法保證客戶端傳來(lái)的請(qǐng)求都是合法的。比如一些要求必傳的參數(shù)沒(méi)有傳遞,傳來(lái)的參數(shù)長(zhǎng)度不符合要求等,這種時(shí)候如果放任不管,繼續(xù)執(zhí)行后續(xù)業(yè)務(wù)邏輯,很有可能就會(huì)出現(xiàn)意想不到的bug。

有人可能會(huì)說(shuō),這不是前端的問(wèn)題嗎,讓前端校驗(yàn)去。話是這么說(shuō),但我們也不能前端校驗(yàn)百分百不會(huì)出現(xiàn)問(wèn)題。并且有些請(qǐng)求可能也不是正規(guī)通過(guò)客戶端發(fā)來(lái)的,可能是黑客惡意攻擊,又或是通過(guò)Postman等發(fā)來(lái)的,這些請(qǐng)求就不一定會(huì)“合法”了。

因此,對(duì)客戶端傳來(lái)的每個(gè)請(qǐng)求都進(jìn)行必要的參數(shù)校驗(yàn)是十分重要的。而很多簡(jiǎn)單的校驗(yàn)如果都需要程序員自己去寫(xiě)的話,就會(huì)導(dǎo)致代碼過(guò)于冗長(zhǎng)、繁瑣。為了讓校驗(yàn)更加簡(jiǎn)潔明了,Spring為我們提供了Validation工具類來(lái)提供各種校驗(yàn)方法。

一、Validation常見(jiàn)的校驗(yàn)注解

空校驗(yàn)注解

  • @Null:被注釋的元素必須為null。
  • @NotNull:被注釋的元素必須不為null
  • @NotBlank:被注釋的字符串去掉前后空格后長(zhǎng)度必須非零。
  • @NotEmpty:被注釋的字符串、集合或數(shù)組不能為空(字符串長(zhǎng)度非零、集合大小非零)。

布爾校驗(yàn)注解

  • @AssertTrue:被注釋的元素必須為true
  • @AssertFalse:被注釋的元素必須為false。

日期校驗(yàn)注解

  • @Past:被注釋的元素必須是一個(gè)過(guò)去的日期。
  • @Future:被注釋的元素必須是一個(gè)將來(lái)的日期。

數(shù)字校驗(yàn)注解

  • @Min(value):被注釋的元素必須是一個(gè)數(shù)字,其值必須大于等于指定的最小值。
  • @Max(value):被注釋的元素必須是一個(gè)數(shù)字,其值必須小于等于指定的最大值。
  • @DecimalMin(value):被注釋的元素必須是一個(gè)數(shù)字,其值必須大于等于指定的最小值。
  • @DecimalMax(value):被注釋的元素必須是一個(gè)數(shù)字,其值必須小于等于指定的最大值。

長(zhǎng)度校驗(yàn)注解

  • @Size(max, min):被注釋的元素(如字符串、集合、數(shù)組)的大小必須在指定的范圍內(nèi)。

模式匹配校驗(yàn)注解

  • @Pattern(regexp):被注釋的元素必須符合指定的正則表達(dá)式。

郵箱校驗(yàn)注解

  • @Email:被注釋的元素必須是電子郵箱地址。

范圍校驗(yàn)注解

  • @Range(min, max):被注釋的元素必須在合適的范圍內(nèi)。

二、Validation的簡(jiǎn)單應(yīng)用

首先我們需要導(dǎo)入Validation的依賴:

<!--validation依賴,負(fù)責(zé)參數(shù)校驗(yàn)-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

接著在需要使用校驗(yàn)的類上添加@Validation注解

接著主要有兩種方式使用校驗(yàn)注解:

1、直接在對(duì)應(yīng)參數(shù)上加上注解

@RestController
@RequestMapping("/user")
@Validation
public class UserController {
    @RequestMapping("/login")
    public Result login(@Size(max = 12,min = 4) String username, @Pattern(regexp = "^\\S{5,16}$") String password){
        //登錄
        return Result.success();
    }
}

2、實(shí)體類添加校驗(yàn)

對(duì)于一些實(shí)體類來(lái)說(shuō),直接在參數(shù)上加注解就不太可取了,程序會(huì)無(wú)法定位到指定參數(shù)。

需要再實(shí)體類內(nèi)部對(duì)應(yīng)的變量上添加注解:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Category {
    @NotNull
    private Integer id;//主鍵ID
    @NotEmpty
    private String categoryName;//分類名稱
    @NotEmpty
    private String categoryAlias;//分類別名
    private Integer createUser;//創(chuàng)建人ID
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;//創(chuàng)建時(shí)間
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;//更新時(shí)間
}

接著在使用實(shí)體類的地方加上 @Validated 注解,就能讓這些校驗(yàn)生效了:

@PutMapping("/update")
    public Result update(@RequestBody @Validated User user){
        //業(yè)務(wù)邏輯
        return Result.success();
    }

三、分組校驗(yàn)

前面我們介紹了如何在實(shí)體類中添加校驗(yàn)注解。但是,事實(shí)上在實(shí)現(xiàn)不同功能時(shí),對(duì)同一個(gè)實(shí)體類的校驗(yàn)規(guī)則可能是會(huì)有差異的。

比如在添加用戶的場(chǎng)景下,用戶的id值就是在存入數(shù)據(jù)庫(kù)后生成的,在參數(shù)傳遞時(shí)自然就不是必傳項(xiàng);而在更新用戶的場(chǎng)景下,我們需要通過(guò)id定位指定用戶,完成信息更新操作,這時(shí)在參數(shù)傳遞時(shí)id就是必傳項(xiàng)了。

這樣,對(duì)id值的校驗(yàn)就會(huì)產(chǎn)生沖突了。如果將id設(shè)定為必傳值,那么就會(huì)導(dǎo)致添加用戶的操作可能出現(xiàn)錯(cuò)誤。不把id設(shè)定為必傳值,更新用戶的操作又會(huì)出現(xiàn)錯(cuò)誤。

為了應(yīng)對(duì)這一問(wèn)題,就可以對(duì)校驗(yàn)項(xiàng)進(jìn)行分組歸類。具體操作步驟如下:

在實(shí)體類內(nèi)部定義相應(yīng)組別接口:

public class User {
    //各成員變量
    //添加用戶類分組
    public interface Add extends Default {
    }
    //更新用戶類分組
    public interface Update extends Default{
    }
}

注意:如果沒(méi)有手動(dòng)對(duì)校驗(yàn)項(xiàng)進(jìn)行分組,其默認(rèn)就在 Default

對(duì)校驗(yàn)項(xiàng)進(jìn)行分組,只需要通過(guò)groups屬性指定組別即可:

@NotNull(groups = Update.class)

接著在校驗(yàn)時(shí)指定對(duì)應(yīng)的分組即可:

@PutMapping
public Result update(@RequestBody @Validated(User.Update.class) User user){
    //業(yè)務(wù)邏輯
    return Result.success();
}
@PostMapping
public Result add(@RequestBody @Validated(User.Add.class) User user){
    //業(yè)務(wù)邏輯
    return Result.success();
}

這樣就能實(shí)現(xiàn)不同業(yè)務(wù)場(chǎng)景下的多樣化校驗(yàn)了。 

四、自定義校驗(yàn)

實(shí)際開(kāi)發(fā)中的校驗(yàn)規(guī)則可能是五花八門(mén)的,但官方提供的校驗(yàn)注解就這么多,很多時(shí)候并不能滿足我們的校驗(yàn)需求。這時(shí)候就需要通過(guò)自定義校驗(yàn)注解來(lái)實(shí)現(xiàn)個(gè)性化的校驗(yàn)了。

首先需要定義一個(gè)注解:

@Documented //元注解
@Target(ElementType.FIELD) //元注解
@Retention(RetentionPolicy.RUNTIME) //元注解
@Constraint(validatedBy = {/*校驗(yàn)規(guī)則*/}) //自定義校驗(yàn)規(guī)則
public @interface State {
    //提供校驗(yàn)失敗后的提示信息
    String message() default "state參數(shù)的值只能是已發(fā)布或草稿";
    //指定分組
    Class<?>[] groups() default {};
    //負(fù)載  獲取到State注解的附加信息
    Class<? extends Payload>[] payload() default {};
}

接著定義一個(gè)類去實(shí)現(xiàn) ConstraintValidator 接口,并實(shí)現(xiàn) isValid 方法:

public class StateValidation implements ConstraintValidator<State,String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        //返回true表示校驗(yàn)通過(guò),返回false則表示校驗(yàn)不通過(guò)
        if(value==null) return false;
        if(value.equals("已發(fā)布")||value.equals("草稿"))return true;
        return false;
    }
}

然后就要在之前定義的注解中的@Constraint中填入自定義類:

 @Constraint(validatedBy = {StateValidation.class}) //自定義校驗(yàn)規(guī)則

接著就可以像使用其它校驗(yàn)注解一樣來(lái)使用自己自定義的注解了:

那么本篇文章就到此為止了,如果覺(jué)得這篇文章對(duì)你有幫助的話,可以點(diǎn)一下關(guān)注和點(diǎn)贊來(lái)支持作者哦。如果有什么講的不對(duì)的地方歡迎在評(píng)論區(qū)指出,希望能夠和你們一起進(jìn)步?

到此這篇關(guān)于spring 參數(shù)校驗(yàn)Validation的文章就介紹到這了,更多相關(guān)spring 參數(shù)校驗(yàn)Validation內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java多線程編程中使用Condition類操作鎖的方法詳解

    Java多線程編程中使用Condition類操作鎖的方法詳解

    Condition是java.util.concurrent.locks包下的類,提供了對(duì)線程鎖的更精細(xì)的控制方法,下面我們就來(lái)看一下Java多線程編程中使用Condition類操作鎖的方法詳解
    2016-07-07
  • Java掩碼的幾種使用例舉

    Java掩碼的幾種使用例舉

    今天小編就為大家分享一篇關(guān)于Java掩碼的使用,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • 解析springboot整合谷歌開(kāi)源緩存框架Guava Cache原理

    解析springboot整合谷歌開(kāi)源緩存框架Guava Cache原理

    本文主要為大家解析了springboot整合谷歌開(kāi)源緩存框架Guava Cache的原理以及在實(shí)際開(kāi)發(fā)過(guò)程中的使用,附含源碼,有需要的朋友可以參考下
    2021-08-08
  • RabbitMQ 3.9.7 鏡像模式集群與Springboot 2.5.5 整合

    RabbitMQ 3.9.7 鏡像模式集群與Springboot 2.5.5 整合

    今天我們來(lái)聊聊 RabbitMQ 3.9.7 鏡像模式集群與Springboot 2.5.5 整合,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-10-10
  • Java基礎(chǔ)篇之反射機(jī)制詳解

    Java基礎(chǔ)篇之反射機(jī)制詳解

    本文詳細(xì)講解了Java基礎(chǔ)篇之反射機(jī)制,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • IDEA生成servlet程序的實(shí)現(xiàn)步驟

    IDEA生成servlet程序的實(shí)現(xiàn)步驟

    這篇文章主要介紹了IDEA生成servlet程序的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Spring Security更換加密方式的完整方案

    Spring Security更換加密方式的完整方案

    隨著現(xiàn)在對(duì)軟件系統(tǒng)安全性要求的越來(lái)越嚴(yán)苛,對(duì)于很多項(xiàng)目,升級(jí)密碼都是勢(shì)在必行的,若項(xiàng)目使用Spring Security框架,只需稍作修改,便可達(dá)到更換加密方式,所以本文給大家介紹了Spring Security更換加密方式的完整方案,需要的朋友可以參考下
    2025-12-12
  • Java使用map實(shí)現(xiàn)帶過(guò)期時(shí)間的緩存機(jī)制

    Java使用map實(shí)現(xiàn)帶過(guò)期時(shí)間的緩存機(jī)制

    在?Java?開(kāi)發(fā)領(lǐng)域,緩存機(jī)制的構(gòu)建通常依賴于?Redis?等專業(yè)緩存數(shù)據(jù)庫(kù),這類解決方案雖能提供強(qiáng)大的緩存能力,但引入中間件意味著增加系統(tǒng)架構(gòu)復(fù)雜度、部署成本與運(yùn)維負(fù)擔(dān),本文將深入探討一種輕量級(jí)替代方案基于?Java?原生Map實(shí)現(xiàn)的帶過(guò)期時(shí)間的緩存機(jī)制
    2025-04-04
  • Java中FileOutputStream類的使用

    Java中FileOutputStream類的使用

    java.io.FileOutputStream類是文件輸出流,用于將數(shù)據(jù)寫(xiě)出到文件,下面就來(lái)介紹一下Java中FileOutputStream類的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • java中自定義Spring Security權(quán)限控制管理示例(實(shí)戰(zhàn)篇)

    java中自定義Spring Security權(quán)限控制管理示例(實(shí)戰(zhàn)篇)

    本篇文章主要介紹了java中自定義Spring Security權(quán)限控制管理示例(實(shí)戰(zhàn)篇) ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02

最新評(píng)論

岢岚县| 昂仁县| 邻水| 万载县| 宁蒗| 祁阳县| 贺州市| 徐水县| 山丹县| 泗洪县| 淄博市| 贡嘎县| 白水县| 新建县| 荆州市| 时尚| 稷山县| 石首市| 盘锦市| 抚顺县| 甘德县| 景洪市| 泸水县| 嘉黎县| 秦安县| 岳池县| 威宁| 咸宁市| 大新县| 涿州市| 抚宁县| 大姚县| 珲春市| 奉贤区| 安康市| 十堰市| 英超| 高邑县| 马龙县| 芜湖县| 隆林|