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

SpringBoot參數(shù)校驗之@Valid與@Validated的用法與場景

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

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

一、核心注解對比

特性@Valid@Validated
標準來源JSR-303/JSR-349規(guī)范(Java標準)Spring框架擴展
作用范圍方法參數(shù)、字段、嵌套對象類、方法、參數(shù)
分組校驗不支持支持
嵌套驗證需配合@Valid遞歸觸發(fā)需配合@Valid遞歸觸發(fā)
使用場景簡單參數(shù)校驗復雜校驗(分組、方法參數(shù)校驗)

二、@Valid的用法與場景

1. 基本使用

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

示例代碼:

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

2. 嵌套驗證

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

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

三、@Validated的進階特性

1. 分組校驗

場景說明:不同業(yè)務場景下,同一對象可能需要不同的校驗規(guī)則。例如,用戶注冊時需要驗證郵箱,而更新信息時不需要。

實現(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) {
    // 僅校驗CreateGroup分組的規(guī)則
    return ResponseEntity.ok().build();
}

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

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

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

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

復雜場景:在分組校驗中觸發(fā)嵌套對象的驗證。

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) {
    // 同時校驗OrderDTO和UserDTO中CreateGroup分組的規(guī)則
    return ResponseEntity.ok().build();
}

五、常見問題與注意事項

1. 異常處理

校驗失敗會拋出以下異常:

  • 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. 依賴問題

確保項目中引入spring-boot-starter-validation

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

3. 注意事項

  • Spring版本兼容性:低版本Spring需手動啟用@EnableWebMvc@Validated支持。
  • 分組接口設計:分組接口建議定義為空接口,僅作為標識。

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

場景推薦注解
Controller層DTO參數(shù)校驗@Valid
分組校驗@Validated + 分組接口
Service層方法參數(shù)校驗@Validated(類級別)
嵌套對象遞歸校驗@Valid + @Validated組合

最佳實踐:

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

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

相關文章

  • 解析Java圖形化編程中的文本框和文本區(qū)

    解析Java圖形化編程中的文本框和文本區(qū)

    這篇文章主要介紹了Java圖形化編程中的文本框和文本區(qū),是Java入門學習中的基礎知識,需要的朋友可以參考下
    2015-10-10
  • Spring boot動態(tài)修改日志級別的方法

    Spring boot動態(tài)修改日志級別的方法

    我們經(jīng)常會遇到業(yè)務想看debug日志的問題,但是debug日志頻繁打印會對日志查看有影響,且日志多對系統(tǒng)也會有一定的壓力,因此,如果可以在需要的時候動態(tài)臨時調(diào)整下日志的級別則是比較完美的,spring boot已經(jīng)支持這種功能,需要的朋友可以參考下
    2022-12-12
  • 如何在Spring?Boot中使用MyBatis訪問數(shù)據(jù)庫

    如何在Spring?Boot中使用MyBatis訪問數(shù)據(jù)庫

    MyBatis可以通過簡單的XML或者注解來配置和映射原始類型,接口,和Java POJO為數(shù)據(jù)庫中記錄,使用MyBatis幫助我們解決各種問題,本文介紹如何在Spring?Boot中使用MyBatis訪問數(shù)據(jù)庫,感興趣的朋友一起看看吧
    2023-11-11
  • Spring五大類注解讀取存儲Bean對象的方法

    Spring五大類注解讀取存儲Bean對象的方法

    這篇文章主要介紹了Spring五大類注解讀取存儲Bean對象,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • 使用MyBatis從hive中讀取數(shù)據(jù)

    使用MyBatis從hive中讀取數(shù)據(jù)

    Hive是一個基于Hadoop的數(shù)據(jù)倉庫工具,它可以方便地對大規(guī)模數(shù)據(jù)進行查詢和分析,本文主要介紹了使用MyBatis從hive中讀取數(shù)據(jù),具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • Java對文件的隨機讀寫以及壓縮處理操作

    Java對文件的隨機讀寫以及壓縮處理操作

    這篇文章主要介紹了Java對文件的隨機讀寫以及壓縮處理操作,是Java入門學習中的基礎知識,需要的朋友可以參考下
    2015-10-10
  • 淺談Java中向上造型向下造型和接口回調(diào)中的問題

    淺談Java中向上造型向下造型和接口回調(diào)中的問題

    這篇文章主要介紹了淺談Java中向上造型向下造型和接口回調(diào)中的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • mybatis typeAliases 給實體類起別名的方法

    mybatis typeAliases 給實體類起別名的方法

    這篇文章主要介紹了mybatis typeAliases 給實體類起別名,本文給大家分享兩種用法,通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Spring Boot 編寫Servlet、Filter、Listener、Interceptor的方法

    Spring Boot 編寫Servlet、Filter、Listener、Interceptor的方法

    這篇文章給大家介紹了spring-boot中如何定義過濾器、監(jiān)聽器和攔截器,對Spring Boot 編寫Servlet、Filter、Listener、Interceptor的相關知識感興趣的朋友一起看看吧
    2017-07-07
  • java爬蟲之使用HttpClient模擬瀏覽器發(fā)送請求方法詳解

    java爬蟲之使用HttpClient模擬瀏覽器發(fā)送請求方法詳解

    這篇文章主要介紹了java爬蟲之使用HttpClient模擬瀏覽器發(fā)送請求方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07

最新評論