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 组的验证规则。
相关推荐
2301_771717211 分钟前
解决mysql报错:1406, Data too long for column
android·数据库·mysql
axng pmje5 分钟前
Java语法进阶
java·开发语言·jvm
rKWP8gKv717 分钟前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫19 分钟前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_4352879220 分钟前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本22 分钟前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
dvjr cloi27 分钟前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
yaoxin5211231 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
dFObBIMmai1 小时前
MySQL主从同步中大事务导致的延迟_如何拆分大事务优化同步
jvm·数据库·python
szccyw01 小时前
mysql如何限制特定存储过程执行权限_MySQL存储过程安全访问
jvm·数据库·python