groups 属性分组

groups 属性在 Bean Validation API 中用于实现分场景验证条件验证。 它的作用是允许你根据不同的操作或场景,应用不同的验证规则。 让我们深入了解它的具体用途:

1. 分场景验证:

  • 场景定义: 不同的场景通常对应于不同的操作,例如添加(Create)、更新(Update)、删除(Delete)等。 也可以根据业务逻辑定义更细粒度的场景。
  • 验证规则分组: 你可以将验证规则(例如 @NotBlank, @Size, @Pattern)分配给不同的验证组(例如 AddGroup.class, EditGroup.class)。
  • 按需应用: 在执行验证时,你可以指定要应用的验证组。 只有属于指定验证组的验证规则才会被执行。

示例:

假设有一个 User 类,包含 idusernameemail 属性。

  • 添加场景(AddGroup): 在添加用户时,id 属性通常由数据库自动生成,不需要验证。 usernameemail 属性不能为空。

  • 编辑场景(EditGroup): 在编辑用户时,id 属性是必需的,用于指定要更新的用户。 usernameemail 属性可以为空,表示不更新这些属性。

    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 属性在 AddGroupEditGroup 场景下都进行邮箱格式验证。

2. 条件验证:

  • 条件判断: 根据对象的某个属性值或其他条件,决定是否应用某些验证规则。
  • 动态分组: 你可以根据条件动态地选择要应用的验证组。

示例:

假设有一个 Product 类,包含 typeprice 属性。

  • 如果 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 组的验证规则。
相关推荐
handsomestWei9 分钟前
Cursor Java开发配置
java·ai编程·环境配置·cursor
Y40900117 分钟前
Java基础——实现图书管理系统交互功能
java·开发语言·笔记·交互
LiuYaoheng26 分钟前
【Android】使用 Intent 传递对象的两种序列化方式
android·java·笔记·学习
啊森要自信37 分钟前
【MySQL 数据库】MySQL索引特性(二)页目录&&(B和B+树)&&(非)聚簇索引 && 索引操作
android·数据库·sql·mysql·adb·数据库架构
寒水馨41 分钟前
Java 24 新特性解析与代码示例
java·开发语言·新特性·jdk24·java24
2025年一定要上岸42 分钟前
【Django】-6- 登录用户身份鉴权
数据库·django·sqlite
奋进的孤狼1 小时前
【Java】在一个前台界面中动态展示多个数据表的字段及数据
java·数据库·oracle
极限实验室1 小时前
IK 字段级别词典升级:IK reload API
数据库
IT利刃出鞘2 小时前
Intellij Idea--解决Cannot download “https://start.spring.io‘: Connect timedout
java·ide·intellij-idea
中国lanwp2 小时前
Spring 全局异常处理机制:多个 @ControllerAdvice 与重复 @ExceptionHandler
java·数据库·spring