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 组的验证规则。
相关推荐
小莫分享2 分钟前
2023年最新总结,阿里,腾讯,百度,美团,头条等技术面试题目,以及答案,专家出题人分析汇总。
java·后端·面试·职场和发展
Brookty3 分钟前
【操作系统】线程
java·linux·服务器·后端·学习·java-ee·操作系统
Dovis(誓平步青云)5 分钟前
探索飞算 JavaAI 进阶:解锁高效Java开发的新维度
java·开发语言·飞算java
小雪_Snow11 分钟前
多态 使用场景
java
经典19921 小时前
mysql 锁介绍
数据库·mysql
不太可爱的大白1 小时前
Mysql分片:一致性哈希算法
数据库·mysql·算法·哈希算法
~ 小团子1 小时前
每日一SQL 【游戏玩法分析 IV】
数据库·sql·游戏
零叹1 小时前
MySQL——常用程序and主从复制
数据库·mysql
胚芽鞘6815 小时前
关于java项目中maven的理解
java·数据库·maven
岁忧6 小时前
(LeetCode 面试经典 150 题 ) 11. 盛最多水的容器 (贪心+双指针)
java·c++·算法·leetcode·面试·go