数据校验-validation-中@NotNull groups 详细用法以及示例

在 Java Bean Validation 中(JSR 380),约束注解(例如 @NotNull)可以通过 groups 属性归类到不同的验证组中,从而在不同的业务场景下选择性地执行验证。这种机制非常适合于“创建”与“更新”操作中字段要求不同的情况。


基本概念

  • 默认组
    如果没有指定 groups 属性,所有约束默认属于 javax.validation.groups.Default 组。

  • 自定义组
    你可以定义一个或多个接口来表示不同的验证组,例如 CreateGroupUpdateGroup 等。

  • 验证时指定组
    在调用验证器或使用 Spring 的 @Validated 时,可以指定需要验证的组,只有属于该组的约束才会被检查。


示例

假设我们有一个用户实体,创建用户时要求 username 和 password 均不能为空,而更新时只要求 username 不能为空,可以这样实现:

1. 定义验证组接口

public interface CreateGroup {
}

public interface UpdateGroup {
}

2. 定义实体类

import javax.validation.constraints.NotNull;

public class User {

    @NotNull(message = "用户名不能为空", groups = {CreateGroup.class, UpdateGroup.class})
    private String username;

    @NotNull(message = "密码不能为空", groups = CreateGroup.class)
    private String password;

    // 省略 getter 和 setter
}

在这个示例中:

  • username 字段在创建和更新时均不能为空。

  • password 字段仅在创建时不能为空。

3. 在 Spring Controller 中使用

在 Spring Boot 中,可以通过 @Validated 注解指定验证组:

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/user")
public class UserController {

    // 创建用户时验证 CreateGroup 组的约束
    @PostMapping("/create")
    public String createUser(@RequestBody @Validated(CreateGroup.class) User user) {
        // 业务逻辑
        return "用户创建成功";
    }

    // 更新用户时验证 UpdateGroup 组的约束
    @PutMapping("/update")
    public String updateUser(@RequestBody @Validated(UpdateGroup.class) User user) {
        // 业务逻辑
        return "用户更新成功";
    }
}

在创建用户的接口中,只有 CreateGroup 组的约束会被检查;在更新用户的接口中,只检查 UpdateGroup 组的约束。


小结

  • 定义验证组:创建接口(例如 CreateGroupUpdateGroup)。

  • 注解分组:在约束注解的 groups 属性中指定需要生效的组。

  • 分场景验证:在验证时通过指定组,只验证目标场景需要的约束。