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 组的验证规则。
相关推荐
胚芽鞘68110 分钟前
关于java项目中maven的理解
java·数据库·maven
岁忧1 小时前
(LeetCode 面试经典 150 题 ) 11. 盛最多水的容器 (贪心+双指针)
java·c++·算法·leetcode·面试·go
CJi0NG1 小时前
【自用】JavaSE--算法、正则表达式、异常
java
Hellyc2 小时前
用户查询优惠券之缓存击穿
java·redis·缓存
今天又在摸鱼2 小时前
Maven
java·maven
老马啸西风2 小时前
maven 发布到中央仓库常用脚本-02
java·maven
代码的余温2 小时前
MyBatis集成Logback日志全攻略
java·tomcat·mybatis·logback
sun0077003 小时前
mysql索引底层原理
数据库·mysql
一只叫煤球的猫3 小时前
【🤣离谱整活】我写了一篇程序员掉进 Java 异世界的短篇小说
java·后端·程序员
斐波娜娜4 小时前
Maven详解
java·开发语言·maven