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
相关产品推荐
相关产品推荐

