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

基于Spring Validation實(shí)現(xiàn)全局參數(shù)校驗(yàn)異常處理的示例詳解

 更新時間:2025年08月26日 09:33:57   作者:小廠永遠(yuǎn)得不到的男人  
在 Spring Boot 項(xiàng)目開發(fā)中,接口參數(shù)校驗(yàn)是保障數(shù)據(jù)合法性的關(guān)鍵環(huán)節(jié),Spring Validation 提供了便捷的參數(shù)校驗(yàn)?zāi)芰?下面我們就來看看具體的實(shí)現(xiàn)方法吧

在 Spring Boot 項(xiàng)目開發(fā)中,接口參數(shù)校驗(yàn)是保障數(shù)據(jù)合法性的關(guān)鍵環(huán)節(jié)。Spring Validation 提供了便捷的參數(shù)校驗(yàn)?zāi)芰?,而全局異常處理則能統(tǒng)一規(guī)范校驗(yàn)失敗的響應(yīng)格式,提升接口友好性。本文將完整介紹如何整合兩者,實(shí)現(xiàn)高效的參數(shù)校驗(yàn)與異常處理。

一、核心依賴引入

首先需在pom.xml(Maven)或build.gradle(Gradle)中引入 Spring Validation 核心依賴,用于支持參數(shù)校驗(yàn)注解。

Maven 依賴

<!-- Spring Validation 核心依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- Web依賴(若項(xiàng)目已引入可忽略) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

二、參數(shù)校驗(yàn)基礎(chǔ)使用(注解式校驗(yàn))

通過在實(shí)體類字段或接口方法參數(shù)上添加校驗(yàn)注解,實(shí)現(xiàn) “聲明式” 參數(shù)校驗(yàn),無需手動編寫校驗(yàn)邏輯。

1. 實(shí)體類參數(shù)校驗(yàn)(常用場景)

在接收請求體的 DTO(數(shù)據(jù)傳輸對象)中,為字段添加@NotNull@NotBlank、@Min等注解,定義校驗(yàn)規(guī)則。

import jakarta.validation.constraints.*; // Spring Boot 3.x使用jakarta包,2.x為javax包

public class UserDTO {
    // 主鍵非空
    @NotNull(message = "用戶ID不能為空")
    private Long id;

    // 用戶名非空且長度1-20
    @NotBlank(message = "用戶名不能為空")
    @Size(min = 1, max = 20, message = "用戶名長度需在1-20字符之間")
    private String username;

    // 年齡18-60歲
    @Min(value = 18, message = "年齡不能小于18歲")
    @Max(value = 60, message = "年齡不能大于60歲")
    private Integer age;

    // 郵箱格式合法
    @Email(message = "郵箱格式不正確")
    private String email;

    // getter/setter省略
}

2. 接口方法添加校驗(yàn)觸發(fā)注解

在 Controller 接口的參數(shù)前添加@Valid(或@Validated)注解,觸發(fā) Spring Validation 的校驗(yàn)邏輯。

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import jakarta.validation.Valid;

@RestController
public class UserController {
    // 新增用戶接口,@Valid觸發(fā)UserDTO的校驗(yàn)
    @PostMapping("/user/add")
    public String addUser(@Valid @RequestBody UserDTO userDTO) {
        // 校驗(yàn)通過后執(zhí)行業(yè)務(wù)邏輯
        return "用戶新增成功:" + userDTO.getUsername();
    }
}

三、全局參數(shù)校驗(yàn)異常處理(核心)

若參數(shù)校驗(yàn)失敗,Spring 會拋出MethodArgumentNotValidException(請求體參數(shù)校驗(yàn)失敗)或ConstraintViolationException(路徑 / 請求參數(shù)校驗(yàn)失?。Mㄟ^@RestControllerAdvice定義全局異常處理器,統(tǒng)一捕獲并處理這些異常,返回標(biāo)準(zhǔn)化響應(yīng)。

1. 定義標(biāo)準(zhǔn)化響應(yīng)體

先創(chuàng)建統(tǒng)一的接口響應(yīng)類,確保異常響應(yīng)與正常響應(yīng)格式一致。

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class Result<T> {
    // 狀態(tài)碼:200成功,400參數(shù)錯誤,500系統(tǒng)錯誤
    private Integer code;
    // 提示信息
    private String message;
    // 響應(yīng)數(shù)據(jù)(成功時返回,失敗時為null)
    private T data;

    // 靜態(tài)工廠方法:參數(shù)錯誤響應(yīng)
    public static Result<Void> paramError(String message) {
        return new Result<>(400, message, null);
    }

    // 靜態(tài)工廠方法:成功響應(yīng)(可省略)
    public static <T> Result<T> success(T data) {
        return new Result<>(200, "success", data);
    }
}

2. 全局異常處理器實(shí)現(xiàn)

通過@RestControllerAdvice注解標(biāo)識全局異常處理類,用@ExceptionHandler指定捕獲的異常類型,編寫處理邏輯。

import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import java.util.stream.Collectors;

// 全局異常處理,作用于所有@RestController
@RestControllerAdvice
public class GlobalValidationExceptionHandler {

    /**
     * 處理請求體參數(shù)校驗(yàn)失敗(@RequestBody + @Valid)
     * 異常類型:MethodArgumentNotValidException
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result<Void> handleMethodArgumentNotValid(MethodArgumentNotValidException e) {
        // 提取所有字段的錯誤信息(如多個參數(shù)校驗(yàn)失敗,合并提示)
        String errorMsg = e.getBindingResult().getFieldErrors().stream()
                .map(FieldError::getDefaultMessage) // 獲取每個字段的自定義錯誤信息
                .collect(Collectors.joining(";")); // 用“;”分隔多個錯誤

        // 返回參數(shù)錯誤響應(yīng)
        return Result.paramError(errorMsg);
    }

    /**
     * 處理路徑參數(shù)/請求參數(shù)校驗(yàn)失?。ㄈ鏎RequestParam/@PathVariable)
     * 異常類型:ConstraintViolationException
     */
    @ExceptionHandler(ConstraintViolationException.class)
    public Result<Void> handleConstraintViolation(ConstraintViolationException e) {
        // 提取參數(shù)錯誤信息
        String errorMsg = e.getConstraintViolations().stream()
                .map(ConstraintViolation::getMessage)
                .collect(Collectors.joining(";"));

        return Result.paramError(errorMsg);
    }
}

四、效果測試與常見場景

1. 請求體參數(shù)校驗(yàn)失敗示例

/user/add接口發(fā)送如下請求(用戶名空、年齡 17):

{
  "id": 1,
  "username": "",
  "age": 17,
  "email": "invalid-email"
}

全局異常處理器會返回響應(yīng):

{
  "code": 400,
  "message": "用戶名不能為空;年齡不能小于18歲;郵箱格式不正確",
  "data": null
}

2. 路徑參數(shù)校驗(yàn)失敗示例

若接口用@PathVariable接收參數(shù)并校驗(yàn):

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import jakarta.validation.constraints.Min;

@GetMapping("/user/{userId}")
public String getUser(@Min(value = 1, message = "用戶ID不能小于1") @PathVariable Long userId) {
    return "查詢用戶ID:" + userId;
}

訪問/user/0時,會返回:

{
  "code": 400,
  "message": "用戶ID不能小于1",
  "data": null
}

五、關(guān)鍵注意事項(xiàng)

  • 注解包路徑問題:Spring Boot 3.x 版本校驗(yàn)注解從javax.validation.constraints遷移到jakarta.validation.constraints,引入依賴時需注意包名匹配,避免類找不到異常。
  • @Valid 與 @Validated 區(qū)別@Valid是 JSR-380 標(biāo)準(zhǔn)注解,支持嵌套校驗(yàn)(如 DTO 內(nèi)部包含另一個需要校驗(yàn)的對象);@Validated是 Spring 擴(kuò)展注解,支持分組校驗(yàn),兩者均可觸發(fā)校驗(yàn)。
  • 分組校驗(yàn)擴(kuò)展:若同一 DTO 在不同接口需不同校驗(yàn)規(guī)則(如 “新增用戶” 無需 ID,“修改用戶” 必須有 ID),可通過 “分組” 實(shí)現(xiàn),需在注解中指定groups屬性,并在@Validated中指定分組。

通過以上步驟,可實(shí)現(xiàn) “注解式參數(shù)校驗(yàn) + 全局異常統(tǒng)一處理” 的完整方案,既減少重復(fù)校驗(yàn)代碼,又保證接口響應(yīng)格式統(tǒng)一,大幅提升開發(fā)效率與接口健壯性。

到此這篇關(guān)于基于Spring Validation實(shí)現(xiàn)全局參數(shù)校驗(yàn)異常處理的示例詳解的文章就介紹到這了,更多相關(guān)Spring Validation參數(shù)校驗(yàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Spring 解決循環(huán)依賴必須要三級緩存嗎

    淺談Spring 解決循環(huán)依賴必須要三級緩存嗎

    這篇文章主要介紹了淺談Spring 解決循環(huán)依賴必須要三級緩存嗎,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • PowerJob的DatabaseMonitorAspect源碼流程

    PowerJob的DatabaseMonitorAspect源碼流程

    這篇文章主要為大家介紹了PowerJob的DatabaseMonitorAspect源碼流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 解決idea創(chuàng)建版本時只有Java21和Java17選項(xiàng)

    解決idea創(chuàng)建版本時只有Java21和Java17選項(xiàng)

    你是否在使用IntelliJ?IDEA創(chuàng)建新項(xiàng)目時遇到了只有Java?21和Java?17的選項(xiàng)?別擔(dān)心,我們的指南將為你提供解決方案,通過簡單的步驟,你將能夠選擇你需要的任何Java版本,繼續(xù)閱讀,讓我們開始吧!
    2024-03-03
  • SpringCloud整合OpenFeign問題

    SpringCloud整合OpenFeign問題

    這篇文章主要介紹了SpringCloud整合OpenFeign問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java中volatile?的作用

    Java中volatile?的作用

    這篇文章主要介紹了Java中volatile?的作用,volatile是Java并發(fā)編程的重要組成部分,主要作用是保證內(nèi)存的可見性和禁止指令重排序,下文更多對volatile作用的介紹,需要的小伙伴可以參考一下
    2022-05-05
  • SpringBoot利用Junit動態(tài)代理實(shí)現(xiàn)Mock方法

    SpringBoot利用Junit動態(tài)代理實(shí)現(xiàn)Mock方法

    說到Spring Boot 單元測試主要有兩個主流集成分別是Mockito,Junit,這個各有特點(diǎn),在實(shí)際開發(fā)中,我想要的測試框架應(yīng)該是這個框架集成者,本文給大家介紹了SpringBoot利用Junit動態(tài)代理實(shí)現(xiàn)Mock方法,需要的朋友可以參考下
    2024-04-04
  • Spring MVC+mybatis實(shí)現(xiàn)注冊登錄功能

    Spring MVC+mybatis實(shí)現(xiàn)注冊登錄功能

    這篇文章主要為大家詳細(xì)介紹了Spring MVC+mybatis實(shí)現(xiàn)注冊登錄功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • SpringBoot中@RestControllerAdvice 全局異常處理的實(shí)現(xiàn)

    SpringBoot中@RestControllerAdvice 全局異常處理的實(shí)現(xiàn)

    本文主要介紹了SpringBoot中@RestControllerAdvice 全局異常處理的實(shí)現(xiàn),通過定義統(tǒng)一響應(yīng)格式、自定義異常類及測試驗(yàn)證,確保接口異常時返回指定格式的提示信息,提升錯誤處理一致性
    2025-06-06
  • 教你使用eclipse?搭建Swt?環(huán)境的全過程

    教你使用eclipse?搭建Swt?環(huán)境的全過程

    本文給大家分享使用eclipse?搭建Swt?環(huán)境的全過程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • SpringBoot解決BigDecimal傳到前端后精度丟失問題

    SpringBoot解決BigDecimal傳到前端后精度丟失問題

    這篇文章將通過示例詳細(xì)為大家介紹SpringBoot如何解決BigDecimal傳到前端后精度丟失問題,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-06-06

最新評論