@Valid和@Validated的區別

七彩鱼丸發表於2024-11-12

1. @Valid 的使用

@Valid 是 Java Bean Validation 規範(JSR-303/JSR-380)中的標準註解。它用於觸發對 Java Bean 的驗證。你可以在類的欄位上使用驗證註解(如 @NotNull, @Size, @Min, @Max 等),然後使用 @Valid 來觸發對這些欄位的驗證。

示例:

java
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.Valid;

public class User {

    @NotNull
    private String name;

    @Size(min = 18)
    private int age;

    // Getters and Setters
}

public class UserRequest {

    @Valid
    private User user;

    // Getters and Setters
}

在這個例子中,UserRequest 類中有一個 User 型別的欄位 user,並使用了 @Valid 註解,這樣在驗證 UserRequest 物件時,Spring 會自動驗證 user 欄位中 User 類的約束條件。

2. @Validated 的使用

@Validated 是 Spring 提供的一個註解,它擴充套件了 @Valid,並增加了對分組驗證的支援。分組驗證允許你根據不同的驗證場景,選擇不同的驗證規則。

分組驗證的概念

透過定義驗證分組,你可以在不同的情況下執行不同的驗證。例如,某些欄位在建立時是必填的,而在更新時則可以是可選的。

示例:

  1. 定義驗證分組:
java
public interface CreateGroup {}
public interface UpdateGroup {}
  1. 在實體類中使用分組:
java
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class User {

    @NotNull(groups = CreateGroup.class)
    private String name;

    @Size(min = 18, groups = CreateGroup.class)
    private int age;

    @Size(min = 1, groups = UpdateGroup.class)
    private String nickname;

    // Getters and Setters
}
  1. 在控制器中使用 @Validated 和指定分組:
java
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

@RestController
public class UserController {

    @PostMapping("/createUser")
    public String createUser(@RequestBody @Validated(CreateGroup.class) User user) {
        // 這裡會進行 CreateGroup 組的驗證
        return "User created!";
    }

    @PutMapping("/updateUser")
    public String updateUser(@RequestBody @Validated(UpdateGroup.class) User user) {
        // 這裡會進行 UpdateGroup 組的驗證
        return "User updated!";
    }
}

@Valid@Validated 的區別

  1. 基本功能:

    • @Valid 是 JSR-303/JSR-380 規範的一部分,用於觸發驗證。
    • @Validated 是 Spring 的擴充套件,除了觸發驗證外,還支援驗證分組。
  2. 驗證分組:

    • @Valid 不支援驗證分組,只會按照預設的驗證規則進行驗證。
    • @Validated 支援驗證分組,可以根據不同的驗證場景選擇不同的驗證規則。
  3. 使用場景:

    • 如果你不需要分組驗證,只需進行普通的驗證,可以使用 @Valid
    • 如果你需要根據不同的業務場景執行不同的驗證邏輯,則可以使用 @Validated 配合分組。

總結:

  • @Valid:標準的 Bean Validation 註解,適用於一般的驗證場景。
  • @Validated:Spring 提供的擴充套件,支援驗證分組,適用於需要分組驗證的場景。

在大多數簡單的應用中,@Valid 足以滿足需求。但是如果你需要根據不同的請求場景(如建立和更新)進行不同的驗證,@Validated 將更加靈活。

相關文章