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

如何为实现指定接口的泛型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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:15:03