groups
属性在 Bean Validation API 中用于实现分场景验证 或条件验证。 它的作用是允许你根据不同的操作或场景,应用不同的验证规则。 让我们深入了解它的具体用途:
1. 分场景验证:
- 场景定义: 不同的场景通常对应于不同的操作,例如添加(Create)、更新(Update)、删除(Delete)等。 也可以根据业务逻辑定义更细粒度的场景。
- 验证规则分组: 你可以将验证规则(例如
@NotBlank
,@Size
,@Pattern
)分配给不同的验证组(例如AddGroup.class
,EditGroup.class
)。 - 按需应用: 在执行验证时,你可以指定要应用的验证组。 只有属于指定验证组的验证规则才会被执行。
示例:
假设有一个 User
类,包含 id
、username
和 email
属性。
-
添加场景(AddGroup): 在添加用户时,
id
属性通常由数据库自动生成,不需要验证。username
和email
属性不能为空。 -
编辑场景(EditGroup): 在编辑用户时,
id
属性是必需的,用于指定要更新的用户。username
和email
属性可以为空,表示不更新这些属性。import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.groups.Default;
import lombok.Data;@Data
public class User {@NotNull(groups = EditGroup.class, message = "ID 不能为空") private Long id; @NotBlank(groups = AddGroup.class, message = "用户名不能为空") private String username; @Email(groups = {AddGroup.class, EditGroup.class}, message = "邮箱格式不正确") private String email; public interface AddGroup extends Default { } public interface EditGroup extends Default { }
}
在这个例子中:
@NotNull(groups = EditGroup.class)
:id
属性只在EditGroup
场景下进行非空验证。@NotBlank(groups = AddGroup.class)
:username
属性只在AddGroup
场景下进行非空验证。@Email(groups = {AddGroup.class, EditGroup.class})
:email
属性在AddGroup
和EditGroup
场景下都进行邮箱格式验证。
2. 条件验证:
- 条件判断: 根据对象的某个属性值或其他条件,决定是否应用某些验证规则。
- 动态分组: 你可以根据条件动态地选择要应用的验证组。
示例:
假设有一个 Product
类,包含 type
和 price
属性。
- 如果
type
为 "electronic",则price
属性必须大于 0。 - 如果
type
为 "book",则price
属性可以为 0。
可以使用自定义的验证器和验证组来实现这种条件验证。
如何使用验证组:
在 Spring Boot 中,可以使用 @Validated
注解来指定要应用的验证组。
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@PostMapping("/add")
public String addUser(@Validated(User.AddGroup.class) @RequestBody User user) {
// 添加用户的逻辑
return "添加成功";
}
@PostMapping("/edit")
public String editUser(@Validated(User.EditGroup.class) @RequestBody User user) {
// 编辑用户的逻辑
return "编辑成功";
}
}
在这个例子中:
@Validated(User.AddGroup.class)
:在addUser
方法中,只应用User.AddGroup
组的验证规则。@Validated(User.EditGroup.class)
:在editUser
方法中,只应用User.EditGroup
组的验证规则。