springboot的实体类字段校验的分组校验具体实现步骤

 更新时间:2025年03月11日 11:21:30   作者:Su米苏  
分组校验允许在不同场景下对同一实体类应用不同的校验规则,通过定义分组接口、在实体类和Controller中指定分组,以及全局异常处理,可以灵活控制校验规则,本文介绍springboot的实体类字段校验的分组校验,感兴趣的朋友一起看看吧

分组校验(Group Validation)允许在不同的场景下对同一个实体类应用不同的校验规则。例如,在新增数据更新数据时,可能需要对某些字段的校验规则进行调整。以下是分组校验的具体实现步骤:

一、定义分组接口

创建空的标记接口(仅用于分组标识):

// 新增时的校验分组
public interface CreateGroup {}
// 更新时的校验分组
public interface UpdateGroup {}

二、在实体类中指定分组

在字段的校验注解中,通过 groups 属性指定所属分组:

public class User {
    @NotBlank(message = "用户ID不能为空", groups = UpdateGroup.class)
    private String id;
    @NotBlank(message = "用户名不能为空", groups = CreateGroup.class)
    private String username;
    @Size(min = 6, max = 20, message = "密码长度需在6到20位之间", groups = {CreateGroup.class, UpdateGroup.class})
    private String password;
    // 省略Getter和Setter
}
  • id 字段:仅在 UpdateGroup 分组下校验(更新时必须校验)。
  • username 字段:仅在 CreateGroup 分组下校验(新增时必须校验)。
  • password 字段:在 CreateGroupUpdateGroup 分组下均校验(新增和更新时都校验)。

三、在Controller中指定校验分组

在Controller方法参数上使用 @Validated 注解(注意是 Spring 的注解,而非 @Valid),并指定分组:

@RestController
public class UserController {
    // 新增用户(校验 CreateGroup 分组)
    @PostMapping("/users")
    public String createUser(@Validated(CreateGroup.class) @RequestBody User user) {
        return "用户新增成功";
    }
    // 更新用户(校验 UpdateGroup 分组)
    @PutMapping("/users/{id}")
    public String updateUser(@Validated(UpdateGroup.class) @RequestBody User user) {
        return "用户更新成功";
    }
}

四、全局异常处理

分组校验失败会抛出 ConstraintViolationException,需在全局异常处理器中捕获:

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(ConstraintViolationException.class)
    public Map<String, Object> handleConstraintViolationException(ConstraintViolationException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getConstraintViolations().forEach(violation -> {
            String field = violation.getPropertyPath().toString();
            String message = violation.getMessage();
            errors.put(field, message);
        });
        return Map.of(
            "code", HttpStatus.BAD_REQUEST.value(),
            "message", "参数校验失败",
            "data", errors
        );
    }
}

五、测试示例 

1. 新增用户(触发 CreateGroup 分组校验)

请求:

POST /users
Content-Type: application/json
{
    "password": "12345"
}

响应:

{
    "code": 400,
    "message": "参数校验失败",
    "data": {
        "username": "用户名不能为空",
        "password": "密码长度需在6到20位之间"
    }
}

2. 更新用户(触发 UpdateGroup 分组校验)

请求:

PUT /users/123
Content-Type: application/json
{
    "password": "12345"
}

响应:

{
    "code": 400,
    "message": "参数校验失败",
    "data": {
        "id": "用户ID不能为空",
        "password": "密码长度需在6到20位之间"
    }
}

六、分组校验的高级用法

1. 多分组组合校验

可以在 @Validated 中同时指定多个分组:

@Validated({CreateGroup.class, AnotherGroup.class})

2. 默认分组

如果字段未指定 groups 属性,则默认属于 Default 分组。可以通过 @Validatedvalue 属性同时包含默认分组:

@Validated(value = {UpdateGroup.class, Default.class})

3. 继承分组

分组接口可以继承其他接口,形成层级关系:

public interface AdvancedGroup extends CreateGroup {}

七、分组校验 vs 多个DTO

方案优点缺点
分组校验避免创建多个相似DTO,减少冗余代码实体类可能包含不同场景的注解
多个DTO职责单一,结构清晰需要维护多个DTO类

总结

通过分组校验,可以灵活控制不同场景下的校验规则,避免为每个场景创建单独的DTO类。关键步骤:

定义分组接口。在实体类字段的校验注解中指定 groups。在Controller方法参数上使用 @Validated(分组.class)。全局捕获 ConstraintViolationException 并返回自定义错误。

到此这篇关于springboot的实体类字段校验的分组校验具体实现步骤的文章就介绍到这了,更多相关springboot分组校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java学生信息管理系统源代码

    java学生信息管理系统源代码

    这篇文章主要为大家详细介绍了java学生信息管理系统源代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 详解SpringMVC从基础到源码

    详解SpringMVC从基础到源码

    这篇文章主要介绍了详解SpringMVC从基础到源码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • C++ 虚函数与纯虚函数代码详解

    C++ 虚函数与纯虚函数代码详解

    本文主要介绍了C++ 虚函数与纯虚函数的使用与区别,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Java8中Stream的使用方式

    Java8中Stream的使用方式

    这篇文章主要介绍了Java8中Stream的使用方式,文章通过Stream的创建展开详细的介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • Java Swing SpringLayout弹性布局的实现代码

    Java Swing SpringLayout弹性布局的实现代码

    这篇文章主要介绍了Java Swing SpringLayout弹性布局的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • response对象的使用(实例讲解)

    response对象的使用(实例讲解)

    下面小编就为大家带来一篇response对象的使用(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Springboot报错java.lang.NullPointerException: null问题

    Springboot报错java.lang.NullPointerException: null问题

    这篇文章主要介绍了Springboot报错java.lang.NullPointerException: null问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Springcloud seata nacos环境搭建过程图解

    Springcloud seata nacos环境搭建过程图解

    这篇文章主要介绍了Springcloud seata nacos环境搭建过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java反射获取实例的速度对比分析

    Java反射获取实例的速度对比分析

    这篇文章主要介绍了Java反射获取实例的速度对比分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 一文掌握Java中的JWT

    一文掌握Java中的JWT

    这篇文章主要介绍了Java中的JWT,JWT的本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,对JWT相关知识感兴趣的朋友一起看看吧
    2022-06-06

最新评论