溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springmvc中@valid與@validated的區別是什么

發布時間:2021-08-06 15:00:11 來源:億速云 閱讀:309 作者:Leah 欄目:編程語言
# SpringMVC中@Valid與@Validated的區別是什么

## 目錄
- [引言](#引言)
- [基本概念](#基本概念)
  - [@Valid注解](#valid注解)
  - [@Validated注解](#validated注解)
- [核心區別對比](#核心區別對比)
  - [1. 所屬規范與來源](#1-所屬規范與來源)
  - [2. 分組校驗支持](#2-分組校驗支持)
  - [3. 應用范圍](#3-應用范圍)
  - [4. 嵌套驗證行為](#4-嵌套驗證行為)
  - [5. 異常處理機制](#5-異常處理機制)
- [使用場景分析](#使用場景分析)
  - [@Valid適用場景](#valid適用場景)
  - [@Validated適用場景](#validated適用場景)
- [代碼示例對比](#代碼示例對比)
  - [基礎校驗示例](#基礎校驗示例)
  - [分組校驗示例](#分組校驗示例)
  - [方法參數校驗示例](#方法參數校驗示例)
- [常見問題與解決方案](#常見問題與解決方案)
- [總結](#總結)

## 引言

在SpringMVC應用開發中,參數校驗是保證數據有效性的重要環節。`@Valid`和`@Validated`作為常用的校驗注解,雖然功能相似,但在實際使用中存在關鍵差異。本文將深入剖析兩者的區別,并通過實際代碼示例展示它們的典型應用場景。

## 基本概念

### @Valid注解
- **所屬規范**:JSR-303/JSR-380(Java標準驗證規范)
- **包路徑**:`javax.validation.Valid`
- **核心功能**:
  - 觸發Bean Validation標準校驗流程
  - 支持級聯驗證(嵌套對象校驗)
  - 默認不支持校驗分組

```java
public class User {
    @NotNull
    private String username;
    
    @Valid // 級聯驗證Address對象
    private Address address;
}

@Validated注解

  • 所屬規范:Spring框架自定義擴展
  • 包路徑org.springframework.validation.annotation.Validated
  • 核心特性
    • 支持校驗分組(Groups)
    • 可用于類級別聲明
    • 支持方法參數校驗(配合Spring AOP)
    • 具備Spring上下文集成能力
@Validated // 類級別聲明
public class UserService {
    
    public void createUser(@Validated(UserGroup.Create.class) User user) {
        // 方法參數校驗
    }
}

核心區別對比

1. 所屬規范與來源

特性 @Valid @Validated
規范標準 JSR-303/JSR-380 Spring框架擴展
是否支持Java標準
是否支持Spring擴展 需配合Spring使用 原生支持Spring特性

2. 分組校驗支持

  • @Validated: “`java public interface UpdateGroup {}

@Data public class User { @NotNull(groups = UpdateGroup.class) private Long id; }

@PostMapping(”/update”) public void update(@Validated(UpdateGroup.class) User user) { // 僅校驗id字段 }

- **@Valid**:無法直接支持分組,需通過其他方式實現

### 3. 應用范圍
| 應用場景         | @Valid | @Validated |
|------------------|--------|------------|
| 方法參數校驗     | 不支持 | 支持       |
| 類級別聲明       | 不支持 | 支持       |
| 字段級聯校驗     | 支持   | 支持       |
| 單獨使用         | 需要Validator | 可直接使用 |

### 4. 嵌套驗證行為
- **@Valid**:必須顯式聲明才能觸發嵌套驗證
  ```java
  public class Order {
      @Valid // 必須添加
      private List<OrderItem> items;
  }
  • @Validated:默認不自動級聯,需配合@Valid使用

5. 異常處理機制

  • 兩者都會拋出MethodArgumentNotValidException(Spring MVC場景)
  • @Validated在方法校驗時可能拋出ConstraintViolationException

使用場景分析

@Valid適用場景

  1. 需要符合JSR標準的校驗
  2. 簡單POJO校驗(無分組需求)
  3. 與其他JavaEE技術棧集成時

@Validated適用場景

  1. 需要分組校驗的復雜業務
    
    @Validated({DefaultGroup.class, AdvancedGroup.class})
    
  2. 服務層方法參數校驗
    
    @Service
    @Validated
    public class PaymentService {
       public void process(@Valid PaymentRequest request) {...}
    }
    
  3. 動態校驗規則切換
  4. Spring Boot自動配置環境

代碼示例對比

基礎校驗示例

// 使用@Valid
@PostMapping("/users")
public ResponseEntity createUser(@RequestBody @Valid User user) {
    // 自動校驗User對象
}

// 使用@Validated(效果相同)
@PostMapping("/users")
public ResponseEntity createUser(@RequestBody @Validated User user) {
    // 基礎校驗無差別
}

分組校驗示例

// 定義校驗分組
public interface BasicInfo {}
public interface AdvancedInfo {}

@Data
public class User {
    @NotBlank(groups = BasicInfo.class)
    private String name;
    
    @Email(groups = AdvancedInfo.class)
    private String email;
}

// 分組校驗
@PostMapping("/users/basic")
public void createBasic(@RequestBody @Validated(BasicInfo.class) User user) {
    // 僅校驗name字段
}

方法參數校驗示例

@Service
@Validated // 必須添加類級別注解
public class OrderService {
    
    public void placeOrder(
        @Min(1) Long userId,
        @Valid Order order) {
        // 基本類型和對象同時校驗
    }
}

常見問題與解決方案

  1. 校驗不生效問題

    • 檢查是否添加@EnableWebMvc
    • 確認依賴包含spring-boot-starter-validation
  2. 分組校驗失效

    • 確保groups屬性正確配置
    • 驗證@Validated注解是否指定正確分組
  3. 嵌套校驗問題

    • 對于集合類型,必須使用@Valid標記:
      
      @Valid
      private List<@Valid OrderItem> items;
      
  4. 自定義校驗器集成

    • @Validated更易與Spring自定義校驗器集成

總結

對比維度 @Valid @Validated
標準性 Java標準規范 Spring特定實現
分組支持 不支持 完整支持
應用層次 主要用于DTO校驗 可用于服務層方法校驗
集成度 需要手動配置 深度Spring集成
推薦場景 簡單校驗、標準化項目 復雜業務校驗、Spring Boot項目

最終建議: - 在純Spring MVC控制器層,兩者可互換使用 - 需要分組校驗或方法參數校驗時,必須使用@Validated - 與其他JavaEE技術集成時建議使用@Valid - 大型項目推薦組合使用:@Validated控制分組,@Valid處理嵌套驗證 “`

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女