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

