Hibernate Validator自定义约束不生效,仅标准@Size注解可正常触发
问题根因
你出现自定义校验不生效的核心原因是混用了两套不同的校验API包:
- 自定义的
@ObjectValid注解、TestValidateur校验器导入的是javax.validation包下的类(Java EE规范) - 而实体类用的
@Size注解、测试代码里的Validator相关类导入的是jakarta.validation包下的类(Jakarta EE规范)
两套API互不兼容,Jakarta版本的校验器无法识别基于javax包定义的自定义约束,所以只会触发同样基于jakarta包的@Size校验。
解决方案
统一所有校验相关类的导入包即可,推荐直接把自定义注解和校验器的导入全部替换为jakarta版本:
- 修改
@ObjectValid注解的导入:
// 把原来的javax.validation开头的导入全部替换为下面的 import jakarta.validation.Constraint; import jakarta.validation.Payload; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;
- 修改
TestValidateur校验器的导入:
// 替换javax.validation导入为jakarta版本 import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext;
改完后重新运行测试,你直接返回false的isValid方法就会被触发,同时拿到@Size和@ObjectValid的校验报错。
额外优化建议
你的实体类名命名为Object,会和java.lang.Object原生类冲突,容易引发不必要的编译歧义,建议改成符合业务含义的其他类名。
内容的提问来源于stack exchange,提问作者Angel
相关产品推荐
相关产品推荐

