如何为实现指定接口的泛型List创建ConstraintValidator约束校验器
自定义列表约束校验器未触发排查项
1. 自定义校验注解配置错误
- 你自己定义的
@MaxSizeConstraint注解上,必须通过@Constraint注解绑定校验器实现类,同时必须包含message、groups、payload三个标准属性,否则校验器不会被注册:
@Target({ElementType.PARAMETER, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = MaxSizeConstraintValidator.class) // 必须绑定你的校验器类 public @interface MaxSizeConstraint { // 三个属性缺一不可 String message() default "列表长度不能超过4"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
2. Controller层注解缺失
- 必须在Controller类上添加Spring提供的
@Validated注解,才能触发方法参数的校验逻辑 - 待校验的
List参数前必须添加你定义的@MaxSizeConstraint注解,如果是POST请求体参数还需要搭配@RequestBody注解,示例:
@RestController @Validated // 类级别必须加该注解 public class MovieController { @PostMapping("/movies") public String batchAdd(@RequestBody @MaxSizeConstraint List<Movie> movies) { return "操作成功"; } }
3. 校验依赖未引入
- Spring Boot 2.3及以上版本中,web starter默认移除了校验组件,需要手动引入依赖:
Maven配置:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
Gradle配置:
implementation 'org.springframework.boot:spring-boot-starter-validation'
4. 校验异常被屏蔽
- 校验触发后会抛出
ConstraintViolationException异常,如果你的项目配置了全局异常处理器,且该异常被无提示吞掉,会导致你误以为校验器未被调用,可以在校验器的isValid方法中打断点或者打印日志确认执行情况。
5. 嵌套属性校验场景遗漏注解
- 如果你是将
List<MaxSizeInterface>作为某个POJO的属性进行校验,除了在该List属性上添加@MaxSizeConstraint注解外,还需要在Controller层接收该POJO的参数前添加@Valid注解,才能触发POJO内部属性的校验。
内容的提问来源于stack exchange,提问作者bloodycheri
相关产品推荐
相关产品推荐

