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

Spring Boot自定义JSR 303校验注解不生效问题求助

校验不触发问题修复方案

必改配置项

  • 引入校验依赖
    Spring Boot 2.3及以上版本中,validation校验组件不再随spring-boot-starter-web默认引入,需要手动添加依赖:
    Maven配置(pom.xml):
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

Gradle配置(build.gradle):

implementation 'org.springframework.boot:spring-boot-starter-validation'
  • 修改校验实现类访问权限
    当前AgeValidatorImpl为默认包访问权限,Spring容器无法正常实例化加载,需添加public修饰符:
public class AgeValidatorImpl implements ConstraintValidator<AgeValidator, Student> {
    // 原有内部逻辑保持不变
}
  • 补充校验触发注解
    你在Controller方法的Student参数上仅添加了自定义校验注解,缺少@Valid注解触发Bean校验流程,修改后的参数写法:
public ResponseEntity saveStudent(@Valid @AgeValidator @RequestBody Student student)
  • 补充空值判断避免空指针
    当前isValid方法未处理入参为空、age为null的场景,会触发空指针异常,优化逻辑:
@Override
public boolean isValid(Student t, ConstraintValidatorContext cvc) {
    System.out.println("AgeValidatorImpl invoked");
    if (t == null || t.getAge() == null) {
        return false;
    }
    return t.getAge() >= 18 && t.getAge() <= 40;
}

可选优化方案

如果后续需要在其他地方复用age校验逻辑,可以调整校验注解的作用范围,直接作用在字段上,不需要校验整个Student对象:

  1. 修改AgeValidator的@Target配置:
@Target({ElementType.PARAMETER, ElementType.FIELD})
  1. 调整校验实现类泛型,改为直接校验Integer类型的age:
public class AgeValidatorImpl implements ConstraintValidator<AgeValidator, Integer> {
    @Override
    public boolean isValid(Integer age, ConstraintValidatorContext cvc) {
        if (age == null) {
            return false;
        }
        return age >=18 && age <=40;
    }
}
  1. 将@AgeValidator注解放到Student类的age字段上即可,Controller参数仅需保留@Valid @RequestBody即可触发校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:48:04