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

SpringBoot使用spring-boot-starter-validation實(shí)現(xiàn)參數(shù)校驗(yàn)

 更新時(shí)間:2025年06月09日 09:01:57   作者:crud  
在開發(fā) RESTful 接口時(shí),接口參數(shù)校驗(yàn)是保障系統(tǒng)健壯性和安全性的重要一環(huán),本文將帶你從零開始掌握如何在 Spring Boot 中使用 spring-boot-starter-validation,并通過多個(gè)實(shí)際案例演示其強(qiáng)大功能,需要的可以了解下

前言

在開發(fā) RESTful 接口時(shí),接口參數(shù)校驗(yàn)是保障系統(tǒng)健壯性和安全性的重要一環(huán)。Spring Boot 提供了對(duì) Bean Validation 的開箱即用支持 —— 通過 spring-boot-starter-validation 模塊,我們可以非常方便地使用 JSR-380 標(biāo)準(zhǔn)定義的注解(如 @NotNull、@NotBlank、@Email 等)進(jìn)行參數(shù)校驗(yàn)。

本文將帶你從零開始掌握如何在 Spring Boot 中使用 spring-boot-starter-validation,并通過多個(gè)實(shí)際案例演示其強(qiáng)大功能,包括:

  • 單個(gè)參數(shù)校驗(yàn)
  • 對(duì)象嵌套校驗(yàn)
  • 自定義校驗(yàn)規(guī)則
  • 全局異常統(tǒng)一處理
  • 多語言錯(cuò)誤信息支持

無論你是初學(xué)者,還是有一定經(jīng)驗(yàn)的開發(fā)者,這篇文章都能讓你寫出更規(guī)范、更健壯的接口!

一、什么是 spring-boot-starter-validation

定義

spring-boot-starter-validation 是 Spring Boot 提供的一個(gè) starter 模塊,它默認(rèn)集成了 Hibernate Validator,實(shí)現(xiàn)了 Java 的 Bean Validation 規(guī)范(JSR-380),可以用于對(duì) Java Bean 的字段進(jìn)行自動(dòng)校驗(yàn)。

特性

特性描述
零配置默認(rèn)集成 Hibernate Validator
注解驅(qū)動(dòng)支持 @NotNull, @Size, @Email 等豐富注解
分組校驗(yàn)可以根據(jù)業(yè)務(wù)場景分組驗(yàn)證
異常統(tǒng)一處理結(jié)合 @ControllerAdvice 統(tǒng)一處理校驗(yàn)失敗
多語言支持支持國際化錯(cuò)誤提示

二、快速入門:引入與使用

Step 1:添加依賴

如果你創(chuàng)建的是一個(gè)標(biāo)準(zhǔn)的 Spring Boot Web 項(xiàng)目,spring-boot-starter-web 已經(jīng)默認(rèn)包含了 spring-boot-starter-validation,無需額外添加。

<!-- 如果你想顯式添加 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

Step 2:定義請求對(duì)象并添加校驗(yàn)注解

import javax.validation.constraints.*;

public class UserRequest {

    @NotBlank(message = "用戶名不能為空")
    private String username;

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

    @Min(value = 18, message = "年齡不能小于18歲")
    @Max(value = 120, message = "年齡不能大于120歲")
    private int age;

    // getters and setters...
}

Step 3:在 Controller 中啟用校驗(yàn)

在 Controller 方法中,使用 @Valid 注解開啟校驗(yàn)邏輯,并結(jié)合 @RequestBody 使用。

@RestController
@RequestMapping("/users")
public class UserController {

    @PostMapping
    public String createUser(@Valid @RequestBody UserRequest request) {
        return "用戶提交成功:" + request.toString();
    }
}

注意:

  • @Valid 必須寫在方法參數(shù)上;
  • 如果校驗(yàn)失敗,會(huì)拋出 MethodArgumentNotValidException 異常;

三、實(shí)戰(zhàn):全局異常統(tǒng)一處理

為了統(tǒng)一返回錯(cuò)誤信息,我們可以使用 @ControllerAdvice 來捕獲所有校驗(yàn)異常。

示例代碼:

@ControllerAdvice
public class GlobalValidationHandler {

    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Map<String, String> handleValidationExceptions(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getAllErrors().forEach((error) -> {
            String fieldName = ((org.springframework.validation.FieldError) error).getField();
            String errorMessage = error.getDefaultMessage();
            errors.put(fieldName, errorMessage);
        });
        return errors;
    }
}

返回示例:

{
  "username": "用戶名不能為空",
  "email": "郵箱格式不正確"
}

 四、高級(jí)用法詳解

1. 嵌套對(duì)象校驗(yàn)

你可以對(duì)嵌套的對(duì)象也進(jìn)行校驗(yàn):

public class AddressRequest {
    @NotBlank(message = "地址不能為空")
    private String detail;
    // getter/setter
}

public class UserRequest {
    @NotBlank(message = "用戶名不能為空")
    private String username;

    @NotNull(message = "地址信息不能為空")
    private AddressRequest address;
    // getter/setter
}

只要加上 @Valid 注解,Spring 會(huì)自動(dòng)遞歸校驗(yàn)嵌套對(duì)象。

2. 分組校驗(yàn)(Group Validation)

有時(shí)候你希望同一個(gè)對(duì)象在不同接口中使用不同的校驗(yàn)規(guī)則?這時(shí)就可以使用分組校驗(yàn)。

第一步:定義分組接口

public interface OnCreate {}
public interface OnUpdate {}

第二步:在實(shí)體類中指定分組

public class UserRequest {

    @NotBlank(groups = OnCreate.class, message = "創(chuàng)建時(shí)用戶名不能為空")
    @NotBlank(groups = OnUpdate.class, message = "更新時(shí)用戶名不能為空")
    private String username;

    @NotBlank(groups = OnCreate.class, message = "郵箱不能為空")
    private String email;
}

第三步:在 Controller 中指定分組

@PostMapping("/create")
public String createUser(@Validated(OnCreate.class) @RequestBody UserRequest request) {
    return "創(chuàng)建用戶";
}

@PostMapping("/update")
public String updateUser(@Validated(OnUpdate.class) @RequestBody UserRequest request) {
    return "更新用戶";
}

注意:此時(shí)必須使用 @Validated 注解(來自 org.springframework.validation.annotation.Validated),而非 @Valid。

3. 自定義校驗(yàn)規(guī)則

當(dāng)內(nèi)置注解不能滿足需求時(shí),可以自定義校驗(yàn)器。

步驟如下:

Step 1:創(chuàng)建注解

@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MobileValidator.class)
public @interface Mobile {
    String message() default "手機(jī)號(hào)格式不正確";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

Step 2:實(shí)現(xiàn)校驗(yàn)器

public class MobileValidator implements ConstraintValidator<Mobile, String> {

    private static final String MOBILE_REGEX = "^1[3-9]\\d{9}$";

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return value != null && value.matches(MOBILE_REGEX);
    }
}

Step 3:使用注解

@Mobile(message = "手機(jī)號(hào)格式錯(cuò)誤")
private String mobile;

五、國際化支持(i18n)

你可以為不同語言提供不同的錯(cuò)誤提示信息:

messages.properties 文件中定義:

NotBlank.userRequest.username=用戶名不能為空
Mobile.userRequest.mobile=手機(jī)號(hào)格式錯(cuò)誤

再配合 Spring 的 MessageSourceLocaleResolver,即可實(shí)現(xiàn)多語言錯(cuò)誤提示。

六、常見問題與解決方案

問題解決方案
校驗(yàn)不生效確保使用 @Valid 或 @Validated
嵌套對(duì)象未校驗(yàn)確保子對(duì)象字段也加了注解
分組無效確保使用 @Validated 并指定分組
錯(cuò)誤信息亂碼設(shè)置響應(yīng)編碼或使用 JSON 序列化
無法獲取字段名使用 FieldError 獲取具體字段

七、總結(jié)對(duì)比表

功能描述
校驗(yàn)方式注解驅(qū)動(dòng),聲明式校驗(yàn)
異常處理@ControllerAdvice 統(tǒng)一處理
嵌套對(duì)象支持遞歸校驗(yàn)
分組校驗(yàn)支持按業(yè)務(wù)場景定制
自定義規(guī)則支持自定義注解和校驗(yàn)器
國際化支持多語言提示

 八、結(jié)語

Spring Boot 提供的 spring-boot-starter-validation 模塊極大簡化了接口參數(shù)校驗(yàn)的開發(fā)流程,使得我們能夠以最小的成本寫出安全、規(guī)范、可維護(hù)性強(qiáng)的接口代碼。

無論是構(gòu)建企業(yè)級(jí)后臺(tái)系統(tǒng),還是搭建高并發(fā) API 平臺(tái),都應(yīng)該合理使用參數(shù)校驗(yàn)來提升系統(tǒng)的穩(wěn)定性與用戶體驗(yàn)。

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

相關(guān)文章

  • Java中BigDecimal類的使用詳解

    Java中BigDecimal類的使用詳解

    這篇文章主要介紹了Java中BigDecimal類的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • java公眾平臺(tái)通用接口工具類HttpConnectUtil實(shí)例代碼

    java公眾平臺(tái)通用接口工具類HttpConnectUtil實(shí)例代碼

    下面小編就為大家分享一篇java公眾平臺(tái)通用接口工具類HttpConnectUtil實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Java8 Map中新增的方法使用總結(jié)

    Java8 Map中新增的方法使用總結(jié)

    這篇文章主要介紹了Java8 Map中新增的方法使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Spring Boot如何使用HikariCP連接池詳解

    Spring Boot如何使用HikariCP連接池詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot如何使用HikariCP連接池的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用springboot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Eclipse下Javassist正確使用方法代碼解析

    Eclipse下Javassist正確使用方法代碼解析

    這篇文章主要介紹了Eclipse下Javassist正確使用方法代碼解析,javassist-3.15.0-ga.jar包是一款在java開發(fā)中十分重要的jar文件包,需要的朋友可以參考下,文中附下載鏈接。
    2017-12-12
  • 高效的java版排列組合算法

    高效的java版排列組合算法

    這篇文章主要為大家詳細(xì)介紹了高效的java版排列組合算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • SpringBoot加載不出來application.yml文件的解決方法

    SpringBoot加載不出來application.yml文件的解決方法

    這篇文章主要介紹了SpringBoot加載不出來application.yml文件的解決方法,文中通過示例代碼講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作有一定的幫助,需要的朋友跟著小編來一起來學(xué)習(xí)吧
    2023-12-12
  • 深入解析Java中的數(shù)據(jù)類型與變量

    深入解析Java中的數(shù)據(jù)類型與變量

    這篇文章主要介紹了深入解析Java中的數(shù)據(jù)類型與變量,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • 使用Idea連接MySQL的詳細(xì)步驟總結(jié)

    使用Idea連接MySQL的詳細(xì)步驟總結(jié)

    今天給大家?guī)淼氖顷P(guān)于IDEA連接數(shù)據(jù)庫的問題,文章圍繞著使用Idea連接MySQL的詳細(xì)步驟展開,文中有非常詳細(xì)的介紹及圖文示例,需要的朋友可以參考下
    2021-06-06
  • MyBatis-Plus之@TableField的用法解讀

    MyBatis-Plus之@TableField的用法解讀

    這篇文章主要介紹了MyBatis-Plus之@TableField的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評(píng)論