You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中如何实现参数校验规则多接口复用 排除指定字段校验

实现方案

完全可以实现,推荐使用Jakarta Bean Validation自带的校验分组特性来完成,无需拆分VO类就能实现不同接口场景下复用同一个VO、执行不同校验规则的需求。

具体实现步骤

1. 定义校验分组接口

首先定义两个空的标记接口,作为不同校验场景的分组标识,不需要实现任何方法:

// 新增操作专属校验分组
public interface CreateGroup {}
// 更新操作专属校验分组
public interface UpdateGroup {}

2. 为VO类的校验注解指定分组

修改原有ModelVo的校验注解,给不同规则绑定对应的生效分组:

public class ModelVo {

    // name字段的非空校验在新增、更新场景都生效
    @NotBlank(message = "...", groups = {CreateGroup.class, UpdateGroup.class})
    private String name;

    // lastName的格式校验仅在新增场景生效
    @Pattern(regex="...", message = "...", groups = CreateGroup.class)
    private String lastName;
    // 其余字段逻辑保持不变
}

3. 接口层指定校验分组

将接口中原来的@Valid注解替换为Spring提供的@Validated注解,指定对应场景的分组即可:

  • 新增接口指定CreateGroup分组,触发全量校验:
@PostMapping("/path1")
public ResponseEntity<RestResponse<Object>> create(@Validated(CreateGroup.class) @RequestBody ModelVo modelvo){
    // 原有业务逻辑不变
}
  • 更新接口指定UpdateGroup分组,不会触发lastName的@Pattern校验:
@PutMapping("/path2")
public ResponseEntity<RestResponse<Object>> update(@Validated(UpdateGroup.class) @RequestBody ModelVo modelvo){
    // 更新业务逻辑
}

补充说明

  • 如果某条校验规则没有显式指定groups属性,默认属于javax.validation.groups.Default分组,若需要和自定义分组同时生效,把Default类加入groups数组即可。
  • 备选实现方案:如果不想修改原有VO的注解,可以拆分VO继承结构,抽取公共校验字段到父类,新增、更新场景分别继承父类实现各自的校验规则,不过整体复用性不如分组方案简洁。

内容的提问来源于stack exchange,提问作者majid_shoorabi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:18:02