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

Spring Boot 2.7单模型实现POST忽略ID校验、PUT不忽略的方案?

解决方案:使用校验分组实现不同请求的字段校验规则

在Spring Boot 2.7中,你可以通过校验分组来实现同一个请求模型在POST和PUT请求下的不同校验规则,不需要创建多个模型类。具体步骤如下:

1. 定义校验分组接口

创建两个空接口作为校验分组的标记,分别对应POST和PUT请求的校验场景:

// 用于POST请求的校验分组
public interface PostGroup {}

// 用于PUT请求的校验分组
public interface PutGroup {}

2. 修改请求模型的校验注解

在CategoryRequestModel的id字段上,给@NotNull注解指定groups属性,让它仅在PutGroup分组下生效:

import lombok.Data;
import javax.validation.constraints.NotNull;

@Data
public class CategoryRequestModel {

    // 仅在PUT请求(PutGroup分组)时校验非空
    @NotNull(groups = PutGroup.class)
    private String id;

    private String title;
    private String status;
}

如果其他字段需要在特定请求下校验,也可以给它们的校验注解添加对应的groups属性。

3. 在Controller中指定校验分组

在Controller的POST和PUT方法上,使用@Validated注解替代@Valid,并指定对应的分组:

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CategoryController {

    // POST请求使用PostGroup分组,id字段的@NotNull不会生效
    @PostMapping("/categories")
    public String createCategory(@Validated(PostGroup.class) @RequestBody CategoryRequestModel model) {
        // 处理创建逻辑
        return "Category created";
    }

    // PUT请求使用PutGroup分组,id字段的@NotNull会强制执行非空校验
    @PutMapping("/categories")
    public String updateCategory(@Validated(PutGroup.class) @RequestBody CategoryRequestModel model) {
        // 处理更新逻辑
        return "Category updated";
    }
}

关键说明

  • @Validated是Spring提供的注解,支持校验分组;而JSR-380的@Valid不支持分组,所以这里必须用@Validated。
  • 分组接口不需要任何实现,只是作为标识来区分不同的校验场景。
  • 如果某个字段需要在多个分组下生效,可以给groups传入多个接口,比如@NotNull(groups = {PostGroup.class, PutGroup.class})。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:20:35