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

SpringBoot參數(shù)校驗(yàn)之@Valid與@Validated的用法與場(chǎng)景

 更新時(shí)間:2025年02月03日 09:47:33   作者:漫天轉(zhuǎn)悠  
這篇文章主要介紹了SpringBoot參數(shù)校驗(yàn)的用法與場(chǎng)景,在實(shí)際開(kāi)發(fā)中,參數(shù)校驗(yàn)是保證接口安全性和數(shù)據(jù)完整性的重要手段,Spring Boot提供了@Valid和@Validated兩個(gè)核心注解來(lái)實(shí)現(xiàn)參數(shù)校驗(yàn),但許多開(kāi)發(fā)者對(duì)它們的區(qū)別和使用場(chǎng)景存在疑惑,需要的朋友可以參考下

在實(shí)際開(kāi)發(fā)中,參數(shù)校驗(yàn)是保證接口安全性和數(shù)據(jù)完整性的重要手段。Spring Boot提供了@Valid@Validated兩個(gè)核心注解來(lái)實(shí)現(xiàn)參數(shù)校驗(yàn),但許多開(kāi)發(fā)者對(duì)它們的區(qū)別和使用場(chǎng)景存在疑惑。本文將深入解析二者的差異,并通過(guò)代碼示例演示其具體應(yīng)用場(chǎng)景。

一、核心注解對(duì)比

特性@Valid@Validated
標(biāo)準(zhǔn)來(lái)源JSR-303/JSR-349規(guī)范(Java標(biāo)準(zhǔn))Spring框架擴(kuò)展
作用范圍方法參數(shù)、字段、嵌套對(duì)象類、方法、參數(shù)
分組校驗(yàn)不支持支持
嵌套驗(yàn)證需配合@Valid遞歸觸發(fā)需配合@Valid遞歸觸發(fā)
使用場(chǎng)景簡(jiǎn)單參數(shù)校驗(yàn)復(fù)雜校驗(yàn)(分組、方法參數(shù)校驗(yàn))

二、@Valid的用法與場(chǎng)景

1. 基本使用

@Valid主要用于方法參數(shù)校驗(yàn),尤其在Controller層對(duì)DTO對(duì)象進(jìn)行驗(yàn)證。需配合JSR-303注解(如@NotNull@Size)使用。

示例代碼:

@PostMapping("/users")
public ResponseEntity<?> createUser(@RequestBody @Valid UserDTO userDTO) {
    // 業(yè)務(wù)邏輯
    return ResponseEntity.ok().build();
}
public class UserDTO {
    @NotBlank(message = "用戶名不能為空")
    private String username;
    @Size(min = 6, max = 20, message = "密碼長(zhǎng)度需在6-20位")
    private String password;
}

2. 嵌套驗(yàn)證

若DTO中包含其他對(duì)象字段,需在字段上添加@Valid觸發(fā)遞歸校驗(yàn)。

public class OrderDTO {
    @Valid  // 觸發(fā)嵌套校驗(yàn)
    private UserDTO user;
    @NotNull(message = "訂單金額不能為空")
    private BigDecimal amount;
}

三、@Validated的進(jìn)階特性

1. 分組校驗(yàn)

場(chǎng)景說(shuō)明:不同業(yè)務(wù)場(chǎng)景下,同一對(duì)象可能需要不同的校驗(yàn)規(guī)則。例如,用戶注冊(cè)時(shí)需要驗(yàn)證郵箱,而更新信息時(shí)不需要。

實(shí)現(xiàn)步驟:

定義分組接口:

public interface CreateGroup {}  // 創(chuàng)建分組
public interface UpdateGroup {}  // 更新分組

在DTO中指定分組:

public class UserDTO {
    @NotBlank(groups = CreateGroup.class, message = "郵箱不能為空")
    private String email;
    @NotBlank(message = "用戶名不能為空")
    private String username;
}

在Controller中使用@Validated激活分組:

@PostMapping("/users")
public ResponseEntity<?> createUser(
    @RequestBody @Validated(CreateGroup.class) UserDTO userDTO) {
    // 僅校驗(yàn)CreateGroup分組的規(guī)則
    return ResponseEntity.ok().build();
}

2. 方法參數(shù)校驗(yàn)

@Validated可用于Service層的方法參數(shù)校驗(yàn),需在類上添加@Validated注解。

@Service
@Validated  // 啟用方法參數(shù)校驗(yàn)
public class UserService {
    public void updateUser(@NotBlank String username, @Min(1) Long userId) {
        // 業(yè)務(wù)邏輯
    }
}

四、嵌套驗(yàn)證與分組校驗(yàn)結(jié)合

復(fù)雜場(chǎng)景:在分組校驗(yàn)中觸發(fā)嵌套對(duì)象的驗(yàn)證。

public class OrderDTO {
    @Validated(CreateGroup.class)  // 指定分組
    @Valid
    private UserDTO user;
    @NotNull(message = "金額必填")
    private BigDecimal amount;
}
// Controller層
@PostMapping("/orders")
public ResponseEntity<?> createOrder(
    @RequestBody @Validated(CreateGroup.class) OrderDTO orderDTO) {
    // 同時(shí)校驗(yàn)OrderDTO和UserDTO中CreateGroup分組的規(guī)則
    return ResponseEntity.ok().build();
}

五、常見(jiàn)問(wèn)題與注意事項(xiàng)

1. 異常處理

校驗(yàn)失敗會(huì)拋出以下異常:

  • MethodArgumentNotValidException(@Valid觸發(fā))
  • ConstraintViolationException(@Validated觸發(fā))

統(tǒng)一異常處理示例:

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<?> handleValidationException(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        return ResponseEntity.badRequest().body(errors);
    }
}

2. 依賴問(wèn)題

確保項(xiàng)目中引入spring-boot-starter-validation

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

3. 注意事項(xiàng)

  • Spring版本兼容性:低版本Spring需手動(dòng)啟用@EnableWebMvc@Validated支持。
  • 分組接口設(shè)計(jì):分組接口建議定義為空接口,僅作為標(biāo)識(shí)。

六、總結(jié)與最佳實(shí)踐

場(chǎng)景推薦注解
Controller層DTO參數(shù)校驗(yàn)@Valid
分組校驗(yàn)@Validated + 分組接口
Service層方法參數(shù)校驗(yàn)@Validated(類級(jí)別)
嵌套對(duì)象遞歸校驗(yàn)@Valid + @Validated組合

最佳實(shí)踐:

  • Controller層:優(yōu)先使用@Valid進(jìn)行簡(jiǎn)單校驗(yàn)。
  • 復(fù)雜業(yè)務(wù)校驗(yàn):使用@Validated的分組功能。
  • Service層參數(shù)校驗(yàn):在類上添加@Validated,配合JSR-303注解。

以上就是SpringBoot中@Valid與@Validated的用法與場(chǎng)景的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot中@Valid與@Validated的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java 根據(jù)網(wǎng)絡(luò)URL獲取該網(wǎng)頁(yè)上面所有的img標(biāo)簽并下載圖片

    Java 根據(jù)網(wǎng)絡(luò)URL獲取該網(wǎng)頁(yè)上面所有的img標(biāo)簽并下載圖片

    這篇文章主要介紹了Java 根據(jù)網(wǎng)絡(luò)URL獲取該網(wǎng)頁(yè)上面所有的img標(biāo)簽并下載圖片,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-11-11
  • Java基礎(chǔ)知識(shí)精通各種運(yùn)算符

    Java基礎(chǔ)知識(shí)精通各種運(yùn)算符

    計(jì)算機(jī)的最基本用途之一就是執(zhí)行數(shù)學(xué)運(yùn)算,作為一門計(jì)算機(jī)語(yǔ)言,Java也提供了一套豐富的運(yùn)算符來(lái)操縱變量,本篇對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下
    2022-04-04
  • SpringCloud手寫Ribbon實(shí)現(xiàn)負(fù)載均衡

    SpringCloud手寫Ribbon實(shí)現(xiàn)負(fù)載均衡

    這篇文章主要介紹了SpringCloud手寫Ribbon實(shí)現(xiàn)負(fù)載均衡的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • java PDF添加圖層的方法 支持多頁(yè)圖層添加

    java PDF添加圖層的方法 支持多頁(yè)圖層添加

    這篇文章主要為大家詳細(xì)介紹了java PDF添加圖層的方法,支持多頁(yè)圖層添加,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • java 實(shí)現(xiàn)圖片圓角處理、背景透明化

    java 實(shí)現(xiàn)圖片圓角處理、背景透明化

    這篇文章主要介紹了java 實(shí)現(xiàn)圖片圓角處理、背景透明化,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 實(shí)例詳解Java中如何對(duì)方法進(jìn)行調(diào)用

    實(shí)例詳解Java中如何對(duì)方法進(jìn)行調(diào)用

    這篇文章主要介紹了實(shí)例詳解Java中如何對(duì)方法進(jìn)行調(diào)用,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • Java將數(shù)字金額轉(zhuǎn)為大寫中文金額

    Java將數(shù)字金額轉(zhuǎn)為大寫中文金額

    這篇文章主要為大家詳細(xì)介紹了Java將數(shù)字金額轉(zhuǎn)為大寫中文金額,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • MyBatis-Plus聯(lián)表查詢的短板及解決方案

    MyBatis-Plus聯(lián)表查詢的短板及解決方案

    mybatis-plus-join是一款用于簡(jiǎn)化MyBatis Plus聯(lián)表查詢的工具,它允許開(kāi)發(fā)者以類似QueryWrapper的方式進(jìn)行聯(lián)表查詢,本文給大家介紹MyBatis-Plus聯(lián)表查詢的短板及解決方案,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • Java使用正則提取字符串中的內(nèi)容的詳細(xì)步驟

    Java使用正則提取字符串中的內(nèi)容的詳細(xì)步驟

    這篇文章主要介紹了Java中使用正則表達(dá)式提取字符串內(nèi)容的方法,通過(guò)Pattern和Matcher類實(shí)現(xiàn),涵蓋編譯正則、查找匹配、分組捕獲、數(shù)字與郵箱提取場(chǎng)景,以及命名分組、非貪婪匹配等技巧,需要的朋友可以參考下
    2025-08-08
  • 使用java生成激活碼和密鑰的方法

    使用java生成激活碼和密鑰的方法

    本文主要介紹了java生成激活碼和密鑰的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05

最新評(píng)論

北流市| 乌鲁木齐县| 日喀则市| 孝昌县| 开封市| 台南县| 慈利县| 竹北市| 永川市| 马关县| 安远县| 雷波县| 屏东市| 新宁县| 临澧县| 新营市| 蒙自县| 五寨县| 福海县| 娄烦县| 全州县| 利川市| 洞头县| 湛江市| 桦川县| 塔城市| 万宁市| 卢氏县| 浦城县| 容城县| 封开县| 达日县| 南丰县| 宕昌县| 新建县| 阳谷县| 郯城县| 桃园市| 日土县| 和静县| 云安县|