欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

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

因此,對客戶端傳來的每個請求都進行必要的參數(shù)校驗是十分重要的。而很多簡單的校驗如果都需要程序員自己去寫的話,就會導致代碼過于冗長、繁瑣。為了讓校驗更加簡潔明了,Spring為我們提供了Validation工具類來提供各種校驗方法。

一、Validation常見的校驗注解

空校驗注解

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

布爾校驗注解

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

日期校驗注解

  • @Past:被注釋的元素必須是一個過去的日期。
  • @Future:被注釋的元素必須是一個將來的日期。

數(shù)字校驗注解

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

長度校驗注解

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

模式匹配校驗注解

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

郵箱校驗注解

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

范圍校驗注解

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

二、Validation的簡單應用

首先我們需要導入Validation的依賴:

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

接著在需要使用校驗的類上添加@Validation注解

接著主要有兩種方式使用校驗注解:

1、直接在對應參數(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ù)上加注解就不太可取了,程序會無法定位到指定參數(shù)。

需要再實體類內(nèi)部對應的變量上添加注解:

@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)建時間
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;//更新時間
}

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

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

三、分組校驗

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

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

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

為了應對這一問題,就可以對校驗項進行分組歸類。具體操作步驟如下:

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

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

注意:如果沒有手動對校驗項進行分組,其默認就在 Default

對校驗項進行分組,只需要通過groups屬性指定組別即可:

@NotNull(groups = Update.class)

接著在校驗時指定對應的分組即可:

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

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

四、自定義校驗

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

首先需要定義一個注解:

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

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

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

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

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

接著就可以像使用其它校驗注解一樣來使用自己自定義的注解了:

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

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

相關(guān)文章

  • Java springboot項目jar發(fā)布過程解析

    Java springboot項目jar發(fā)布過程解析

    這篇文章主要介紹了Java springboot項目jar發(fā)布過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • Java安全-ClassLoader

    Java安全-ClassLoader

    這篇文章主要介紹了Java安全ClassLoader,Java類初始化的時候會調(diào)用java.lang.ClassLoader加載字節(jié)碼,ClassLoader就是用來動態(tài)加載class文件到內(nèi)存當中用的,下面詳細內(nèi)容,需要的小伙伴可以參考一下
    2022-01-01
  • Java報錯:java.util.concurrent.ExecutionException的解決辦法

    Java報錯:java.util.concurrent.ExecutionException的解決辦法

    在Java并發(fā)編程中,我們經(jīng)常使用java.util.concurrent包提供的工具來管理和協(xié)調(diào)多個線程的執(zhí)行,va并發(fā)編程中,然而,在使用這些工具時,可能會遇到各種各樣的異常,其中之一就是java.util.concurrent.ExecutionException,本文將詳細分析這種異常的背景、可能的原因
    2024-09-09
  • java開發(fā)分布式服務(wù)框架Dubbo原理機制詳解

    java開發(fā)分布式服務(wù)框架Dubbo原理機制詳解

    這篇文章主要為大家介紹了java開發(fā)分布式服務(wù)框架Dubbo的原理機制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • Spring MVC Locale 本地化示例詳解

    Spring MVC Locale 本地化示例詳解

    這篇文章主要為大家介紹了Spring MVC Locale本地化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Java實現(xiàn)將Word轉(zhuǎn)換成Html的示例代碼

    Java實現(xiàn)將Word轉(zhuǎn)換成Html的示例代碼

    在業(yè)務(wù)中,常常會需要在瀏覽器中預覽Word文檔,或者需要將Word文檔轉(zhuǎn)成HTML文件保存,本文主要為大家詳細介紹了Java實現(xiàn)Word轉(zhuǎn)換成Html的相關(guān)方法,希望對大家有所幫助
    2024-02-02
  • Java集合 LinkedList的原理及使用詳解

    Java集合 LinkedList的原理及使用詳解

    這篇文章主要介紹了Java集合 LinkedList的原理及使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • java基于遞歸算法實現(xiàn)漢諾塔問題實例

    java基于遞歸算法實現(xiàn)漢諾塔問題實例

    這篇文章主要介紹了java基于遞歸算法實現(xiàn)漢諾塔問題,結(jié)合具體實例形式分析了java遞歸算法的實現(xiàn)與使用技巧,需要的朋友可以參考下
    2017-07-07
  • Spring整合Junit詳解

    Spring整合Junit詳解

    Spring 是目前主流的 Java Web 開發(fā)框架,是 Java 世界最為成功的框架。該框架是一個輕量級的開源框架,具有很高的凝聚力和吸引力,本篇文章帶你了解如何配置數(shù)據(jù)源、注解開發(fā)以及整合Junit
    2022-07-07
  • 創(chuàng)建好SpringBoot項目后但是找不到Maven的解決方法

    創(chuàng)建好SpringBoot項目后但是找不到Maven的解決方法

    在使用IDEA專業(yè)版創(chuàng)建好SpringBoot項目后,發(fā)現(xiàn)上方導航欄的運行按鈕是灰色的,而且左側(cè)導航欄的pom.xml的圖標顏色也不是正常的,點開右側(cè)導航欄的Maven后,發(fā)現(xiàn)Maven找不到,所以本文介紹了創(chuàng)建好SpringBoot項目后但是找不到Maven的解決方法,需要的朋友可以參考下
    2024-10-10

最新評論