1. @Valid
的使用
@Valid
是 Java Bean Validation 规范(JSR-303/JSR-380)中的标准注解。它用于触发对 Java Bean 的验证。你可以在类的字段上使用验证注解(如 @NotNull
, @Size
, @Min
, @Max
等),然后使用 @Valid
来触发对这些字段的验证。
示例:
javaimport 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
,并增加了对分组验证的支持。分组验证允许你根据不同的验证场景,选择不同的验证规则。
分组验证的概念
通过定义验证分组,你可以在不同的情况下执行不同的验证。例如,某些字段在创建时是必填的,而在更新时则可以是可选的。
示例:
- 定义验证分组:
public interface CreateGroup {}
public interface UpdateGroup {}
- 在实体类中使用分组:
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
}
- 在控制器中使用
@Validated
和指定分组:
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
的区别
-
基本功能:
@Valid
是 JSR-303/JSR-380 规范的一部分,用于触发验证。@Validated
是 Spring 的扩展,除了触发验证外,还支持验证分组。
-
验证分组:
@Valid
不支持验证分组,只会按照默认的验证规则进行验证。@Validated
支持验证分组,可以根据不同的验证场景选择不同的验证规则。
-
使用场景:
- 如果你不需要分组验证,只需进行普通的验证,可以使用
@Valid
。 - 如果你需要根据不同的业务场景执行不同的验证逻辑,则可以使用
@Validated
配合分组。
- 如果你不需要分组验证,只需进行普通的验证,可以使用
总结:
@Valid
:标准的 Bean Validation 注解,适用于一般的验证场景。@Validated
:Spring 提供的扩展,支持验证分组,适用于需要分组验证的场景。
在大多数简单的应用中,@Valid
足以满足需求。但是如果你需要根据不同的请求场景(如创建和更新)进行不同的验证,@Validated
将更加灵活。