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

SpringBoot如何優(yōu)雅實(shí)現(xiàn)接口參數(shù)驗(yàn)證

 更新時(shí)間:2023年08月25日 08:48:22   作者:小虎哥的技術(shù)博客  
為了保證參數(shù)的正確性,我們需要使用參數(shù)驗(yàn)證機(jī)制,來(lái)檢測(cè)并處理傳入的參數(shù)格式是否符合規(guī)范,所以本文就來(lái)和大家聊聊如何優(yōu)雅實(shí)現(xiàn)接口參數(shù)驗(yàn)證吧

1. 為什么需要參數(shù)驗(yàn)證

在應(yīng)用程序的開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到需要保證傳入?yún)?shù)的正確性的情況。例如,當(dāng)我們?cè)谧?cè)用戶(hù)時(shí),需要驗(yàn)證用戶(hù)填寫(xiě)的表單數(shù)據(jù)是否符合規(guī)范,是否缺少必填字段,或者格式是否正確,等等。如果不對(duì)參數(shù)進(jìn)行驗(yàn)證,我們的應(yīng)用程序可能會(huì)因此受到攻擊或者運(yùn)行出錯(cuò)。

為了保證參數(shù)的正確性,我們需要使用參數(shù)驗(yàn)證機(jī)制,來(lái)檢測(cè)并處理傳入的參數(shù)格式是否符合規(guī)范。

2. 如何進(jìn)行參數(shù)驗(yàn)證

Spring Boot內(nèi)置了一個(gè)很強(qiáng)大的參數(shù)驗(yàn)證框架——JSR 303 Bean Validation 標(biāo)準(zhǔn),它可以對(duì)我們的實(shí)體類(lèi)參數(shù)進(jìn)行校驗(yàn),并且可以給我們提供詳細(xì)的錯(cuò)誤提示信息。

具體步驟如下:

1. 添加依賴(lài)

pom.xml 文件中添加以下依賴(lài):

<!-- 添加 JSR-303 Bean Validation 依賴(lài) -->
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>
<!-- Hibernate Validator 的實(shí)現(xiàn) --> 
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.1.5.Final</version>
</dependency>

2. 在實(shí)體類(lèi)中添加參數(shù)驗(yàn)證注解

public class User {
    @NotNull(message="用戶(hù)名不能為空")
    private String username;
    @NotNull(message="密碼不能為空")
    @Size(min=6, max=20, message="密碼長(zhǎng)度應(yīng)該在6到20位")   
    private String password;
    // getter 和 setter 方法
}

在實(shí)體類(lèi)中使用注解,如上代碼所示,可以指定當(dāng)前字段是否可以為 null,以及字符串的長(zhǎng)度和格式等信息,如果傳入的參數(shù)不符合預(yù)定的規(guī)則,在校驗(yàn)時(shí)就會(huì)產(chǎn)生相應(yīng)的提示。

常用的參數(shù)驗(yàn)證注解:

  • @NotNull:驗(yàn)證注解的元素值不為null;
  • @NotEmpty:驗(yàn)證注解的元素值不為null,且String類(lèi)型也不為 "";
  • @NotBlank:驗(yàn)證注解的元素值不為null,且允許去除兩端空格后不為空;
  • @Size:驗(yàn)證注解的元素值長(zhǎng)度在min和max范圍內(nèi);
  • @Digits:驗(yàn)證注解元素值的整數(shù)位數(shù)和小數(shù)位數(shù)是否符合預(yù)期;
  • @Range:驗(yàn)證注解元素值的大小是否在指定范圍內(nèi);
  • @Email:驗(yàn)證注解的元素值是否為Email格式。

3. 在Controller中加入對(duì)參數(shù)的驗(yàn)證

@RestController
@RequestMapping("/user")
public class UserController {
    @PostMapping("/register")
    public CommonResult<User> register(@RequestBody @Validated User user) {
        return CommonResult.success(user);
    }
}

在Controller層進(jìn)行參數(shù)校驗(yàn)時(shí),加上 @Validated 注解以告訴Spring進(jìn)行參數(shù)校驗(yàn),@RequestBody 注解用于將請(qǐng)求體中的JSON數(shù)據(jù)綁定到實(shí)體類(lèi)中。

4. 定義全局異常處理器,并定義返回結(jié)果CommonResult

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public CommonResult<Object> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex){
        List<ObjectError> errors = ex.getBindingResult().getAllErrors();
        StringBuilder errorMsg = new StringBuilder();
        errors.forEach(error -> errorMsg.append(error.getDefaultMessage()).append("; "));
        return CommonResult.fail(ResultCode.PARAM_VALID_ERROR.getCode(), errorMsg.toString(), null);
    }
    @ExceptionHandler(value = Exception.class)
    public CommonResult<Object> handleException(Exception ex){
        log.error("系統(tǒng)發(fā)生異常:", ex);
        return CommonResult.fail(ResultCode.SYSTEM_ERROR.getCode(), ResultCode.SYSTEM_ERROR.getMsg(), null);
    }
}

在上述代碼中,我們定義了兩個(gè)異常處理方法,一個(gè)處理 MethodArgumentNotValidException 異常,一個(gè)處理其他類(lèi)型的異常,使用了 @ExceptionHandler 注解將不同類(lèi)型的異常映射到不同的處理方法中。

public enum ResultCode {
    SUCCESS(200, "操作成功"),
    PARAM_VALID_ERROR(400, "參數(shù)校驗(yàn)失敗"),
    UNAUTHORIZED(401, "未認(rèn)證"),
    FORBIDDEN(403, "無(wú)權(quán)限"),
    SYSTEM_ERROR(500, "服務(wù)器內(nèi)部錯(cuò)誤");
    private int code;
    private String msg;
    ResultCode(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    public int getCode() {
        return code;
    }
    public String getMsg() {
        return msg;
    }
}
public class CommonResult<T> {
    private int code;
    private String msg;
    private T data;
    public CommonResult() {}
    public CommonResult(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    public static <T> CommonResult<T> success(T data) {
        return new CommonResult<T>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMsg(), data);
    }
    public static <T> CommonResult<T> fail(ResultCode resultCode) {
        return new CommonResult<T>(resultCode.getCode(), resultCode.getMsg(), null);
    }
    public static <T> CommonResult<T> fail(ResultCode resultCode, T data) {
        return new CommonResult<T>(resultCode.getCode(), resultCode.getMsg(), data);
    }
    // getter 和 setter 方法
}

在上述代碼中,我們使用泛型和枚舉類(lèi)定義各種操作返回的枚舉值,通過(guò)封裝返回值,返回給前端統(tǒng)一的返回格式,減少重復(fù)代碼。

5. 通過(guò)Postman模擬測(cè)試參數(shù)驗(yàn)證

我們將請(qǐng)求方式設(shè)置為 POST,并將請(qǐng)求的 URL 設(shè)置為 http://localhost:8080/user/register。另外,我們還需要設(shè)置請(qǐng)求頭的 Content-Type 為 application/json。

我們傳入了一個(gè)用戶(hù)名為 user ,密碼為 123 的用戶(hù)并進(jìn)行請(qǐng)求,這個(gè)請(qǐng)求在參數(shù)校驗(yàn)的過(guò)程中會(huì)出現(xiàn)異常。

最終的打印結(jié)果為:

{
    "code": 400,
    "msg": "密碼長(zhǎng)度應(yīng)該在6到20位; ",
    "data": null
}

3.自定義注解和驗(yàn)證器

在實(shí)體類(lèi)中使用注解進(jìn)行參數(shù)驗(yàn)證,這種方式非常簡(jiǎn)單快捷,但對(duì)于一些復(fù)雜的邏輯驗(yàn)證可能不夠靈活。我們也可以采用編寫(xiě)自定義注解和驗(yàn)證器的方式進(jìn)行參數(shù)驗(yàn)證。

比如,我們可以編寫(xiě)自定義注解 @Age 和驗(yàn)證器 AgeValidator,使用這兩個(gè)自定義類(lèi)對(duì)請(qǐng)求參數(shù)進(jìn)行驗(yàn)證,示例代碼如下:

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {AgeValidator.class})
public @interface Age {
    String message() default "年齡不在合法范圍內(nèi)";
    int minAge() default 0;
    int maxAge() default 150;
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
public class AgeValidator implements ConstraintValidator<Age, Integer> {
    private int minAge;
    private int maxAge;
    @Override
    public void initialize(Age constraintAnnotation) {
        this.minAge = constraintAnnotation.minAge();
        this.maxAge = constraintAnnotation.maxAge();
    }
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        if(value == null) {
            return true; // 允許為空值
        }
        if(value < minAge || value > maxAge) {
            return false; // 驗(yàn)證不通過(guò)
        }
        return true; // 驗(yàn)證通過(guò)
    }
}
public class User {
    @NotNull(message="用戶(hù)名不能為空")
    private String username;
    @Age(message="年齡不在合法范圍內(nèi)", minAge=0, maxAge=120)
    private Integer age;
    // getter 和 setter 方法
}

如上代碼展示了如何使用自定義注解和驗(yàn)證器進(jìn)行參數(shù)驗(yàn)證,使用自定義注解時(shí),我們可以指定年齡的最小值和最大值,并使用 AgeValidator 在實(shí)體類(lèi)中對(duì)年齡進(jìn)行驗(yàn)證。

4.小結(jié)

使用參數(shù)驗(yàn)證機(jī)制可以有效地提高我們應(yīng)用程序的健壯性和安全性,同時(shí)也可以節(jié)省我們進(jìn)行參數(shù)校驗(yàn)的時(shí)間和精力。Spring Boot 內(nèi)置的參數(shù)驗(yàn)證框架 JSR 303 Bean Validation 標(biāo)準(zhǔn)可以幫助我們簡(jiǎn)單快速地完成參數(shù)校驗(yàn),結(jié)合全局異常處理器和自定義的響應(yīng)結(jié)果類(lèi),我們可以快速反饋請(qǐng)求信息的正確性,并在出現(xiàn)錯(cuò)誤時(shí)提供詳細(xì)的錯(cuò)誤提示信息,非常方便實(shí)用。

以上就是SpringBoot如何優(yōu)雅實(shí)現(xiàn)接口參數(shù)驗(yàn)證的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot接口參數(shù)驗(yàn)證的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

  • 關(guān)于Spring?Validation數(shù)據(jù)校檢的使用流程分析

    關(guān)于Spring?Validation數(shù)據(jù)校檢的使用流程分析

    在實(shí)際項(xiàng)目中,對(duì)客戶(hù)端傳遞到服務(wù)端的參數(shù)進(jìn)行校驗(yàn)至關(guān)重要,SpringValidation提供了一種便捷的方式來(lái)實(shí)現(xiàn)這一需求,通過(guò)在POJO類(lèi)的屬性上添加檢查注解,本文給大家介紹Spring?Validation數(shù)據(jù)校檢的使用流程,感興趣的朋友一起看看吧
    2024-11-11
  • Java線程優(yōu)先級(jí)和守護(hù)線程原理解析

    Java線程優(yōu)先級(jí)和守護(hù)線程原理解析

    這篇文章主要介紹了Java線程優(yōu)先級(jí)和守護(hù)線程原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 教你用Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的代碼生成器

    教你用Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的代碼生成器

    今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著如何用Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的代碼生成器展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • SpringBoot配置文件中密碼屬性加密的實(shí)現(xiàn)

    SpringBoot配置文件中密碼屬性加密的實(shí)現(xiàn)

    本文主要介紹了SpringBoot配置文件中密碼屬性加密的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Java構(gòu)造器使用方法及注意事項(xiàng)

    Java構(gòu)造器使用方法及注意事項(xiàng)

    這篇文章主要介紹了Java構(gòu)造器使用方法及注意事項(xiàng)的相關(guān)資料,這里舉例說(shuō)明如何使用構(gòu)造器及需要注意的地方,需要的朋友可以參考下
    2017-07-07
  • Java中的二維數(shù)組的賦值與輸出方式

    Java中的二維數(shù)組的賦值與輸出方式

    這篇文章主要介紹了Java中的二維數(shù)組的賦值與輸出方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • java逗號(hào)分隔String字符串及數(shù)組、集合相互轉(zhuǎn)換

    java逗號(hào)分隔String字符串及數(shù)組、集合相互轉(zhuǎn)換

    我們?cè)谌粘i_(kāi)發(fā)時(shí)會(huì)經(jīng)常遇到將一個(gè)字符串按照逗號(hào)進(jìn)行分割,這篇文章主要給大家介紹了關(guān)于java逗號(hào)分隔String字符串及數(shù)組、集合相互轉(zhuǎn)換的相關(guān)資料,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2024-02-02
  • Java中高效的對(duì)象映射庫(kù)Orika的用法詳解

    Java中高效的對(duì)象映射庫(kù)Orika的用法詳解

    Orika是一個(gè)高效的Java對(duì)象映射庫(kù),專(zhuān)門(mén)用于在Java應(yīng)用程序中簡(jiǎn)化對(duì)象之間的轉(zhuǎn)換,下面就跟隨小編一起來(lái)深入了解下Orika的具體使用吧
    2024-11-11
  • 解讀CommandLineRunner或者ApplicationRunner接口

    解讀CommandLineRunner或者ApplicationRunner接口

    這篇文章主要介紹了解讀CommandLineRunner或者ApplicationRunner接口的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 最新評(píng)論

    新密市| 滦平县| 开封市| 伊川县| 仁寿县| 达尔| 鄂温| 兴文县| 德兴市| 黄梅县| 镇远县| 通山县| 赤峰市| 杭锦旗| 吉木乃县| 烟台市| 河北区| 丰都县| 仁寿县| 永济市| 连南| 江油市| 临清市| 寿阳县| 宁德市| 二手房| 乐昌市| 洛南县| 无极县| 西林县| 衡水市| 武鸣县| 台北市| 富阳市| 舒城县| 温州市| 永州市| 澄城县| 内丘县| 仙居县| 剑川县|