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 组的验证规则。
相关推荐
yb0os14 分钟前
RPC实战和核心原理学习(一)----基础
java·开发语言·网络·数据结构·学习·计算机·rpc
liuyao_xianhui12 分钟前
内存管理(C/C++)
java·开发语言·c++
蒋士峰DBA修行之路15 分钟前
实验五 静态剪枝
数据库·算法·剪枝
蒋士峰DBA修行之路18 分钟前
实验六 动态剪枝
数据库·算法·剪枝
superlls19 分钟前
(设计模式)区分建造者、 规格模式(MyBatis Example+Criteria )
java·tomcat
kimble_xia@oracle30 分钟前
SQL 笔记
java·数据库·oracle
David爱编程1 小时前
深度解析:synchronized 性能演进史,从 JDK1.6 到 JDK17
java·后端
脑子慢且灵1 小时前
【JavaWeb】一个简单的Web浏览服务程序
java·前端·后端·servlet·tomcat·web·javaee
B612 little star king1 小时前
力扣29. 两数相除题解
java·算法·leetcode
野犬寒鸦1 小时前
力扣hot100:环形链表(快慢指针法)(141)
java·数据结构·算法·leetcode·面试·职场和发展