@Valid 與 @Validated 的區別

del88發表於2024-08-11

結論是:@Validated 基本對我無用;

@Valid與@Validated在Java開發中,特別是在進行資料校驗時,扮演著重要的角色,但它們之間存在一些關鍵的區別。以下是對這兩個註解的詳細比較:

一、定義與作用範圍

  1. @Valid

    • 定義:@Valid是Java EE提供的標準註解,它是JSR 303規範的一部分,主要用於Hibernate Validation等場景。
    • 作用範圍:可以用在方法、建構函式、方法引數和成員屬性(欄位)上,支援巢狀驗證,即可以驗證物件內部的屬性。
  2. @Validated

    • 定義:@Validated是Spring框架特有的註解,屬於Spring的一部分,也是JSR 303的一個變種。它提供了一些@Valid所沒有的額外功能,比如分組驗證。
    • 作用範圍:可以用在類、方法和方法引數上,但不能用於成員屬性(欄位)上,也不支援直接在成員屬性上進行巢狀驗證,但可以透過與@Valid結合使用來實現巢狀驗證。

二、功能與特性

  1. 巢狀驗證

    • @Valid:支援巢狀驗證,即可以驗證物件內部的其他物件屬性。
    • @Validated:不支援直接在成員屬性上進行巢狀驗證,但可以透過在巢狀物件前加@Valid註解來實現巢狀驗證。
  2. 分組驗證

    • @Valid:沒有分組驗證功能。
    • @Validated:支援分組驗證,允許在驗證時指定一組特定的約束,這對於條件驗證尤其有用。例如,在建立和更新物件時,可能需要應用不同的驗證規則。

三、使用場景與示例

  • @Valid示例:

    public class User {
        @NotNull
        private String name;
    
        @Valid
        private Address address; // Address類內部也有需要驗證的欄位
    }
    
    public void createUser(@Valid User user) {
        // ...
    }
    
  • @Validated示例(分組驗證):

    public interface OnCreate {}
    public interface OnUpdate {}
    
    public class User {
        @NotNull(groups = OnCreate.class)
        private String email;
    
        @NotNull(groups = OnUpdate.class)
        private String password;
    }
    
    @RestController
    @Validated
    public class UserController {
        @PostMapping("/user")
        public ResponseEntity<String> createUser(@Validated(OnCreate.class) @RequestBody User user) {
            // ...
        }
    
        @PutMapping("/user")
        public ResponseEntity<String> updateUser(@Validated(OnUpdate.class) @RequestBody User user) {
            // ...
        }
    }
    

四、總結

  • @Valid@Validated都是用於資料校驗的註解,但它們在作用範圍、巢狀驗證和分組驗證等方面存在差異。
  • @Valid更通用,支援成員屬性的校驗和巢狀驗證;而@Validated則提供了分組驗證等Spring特有的功能,且不能直接用於成員屬性的校驗,但可以透過與@Valid結合使用來實現更復雜的校驗邏輯。
  • 在實際開發中,應根據具體需求選擇合適的註解,以達到最佳的資料校驗效果。

相關文章