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对象:
- 修改
AgeValidator的@Target配置:
@Target({ElementType.PARAMETER, ElementType.FIELD})
- 调整校验实现类泛型,改为直接校验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; } }
- 将
@AgeValidator注解放到Student类的age字段上即可,Controller参数仅需保留@Valid @RequestBody即可触发校验。
内容的提问来源于stack exchange,提问作者DEEPAK MAURYA
相关产品推荐
相关产品推荐

