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

Hibernate Validator自定义约束不生效,仅标准@Size注解可正常触发

问题根因

你出现自定义校验不生效的核心原因是混用了两套不同的校验API包:

  • 自定义的@ObjectValid注解、TestValidateur校验器导入的是javax.validation包下的类(Java EE规范)
  • 而实体类用的@Size注解、测试代码里的Validator相关类导入的是jakarta.validation包下的类(Jakarta EE规范)
    两套API互不兼容,Jakarta版本的校验器无法识别基于javax包定义的自定义约束,所以只会触发同样基于jakarta包的@Size校验。

解决方案

统一所有校验相关类的导入包即可,推荐直接把自定义注解和校验器的导入全部替换为jakarta版本:

  1. 修改@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;
  1. 修改TestValidateur校验器的导入:
// 替换javax.validation导入为jakarta版本
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

改完后重新运行测试,你直接返回false的isValid方法就会被触发,同时拿到@Size和@ObjectValid的校验报错。

额外优化建议

你的实体类名命名为Object,会和java.lang.Object原生类冲突,容易引发不必要的编译歧义,建议改成符合业务含义的其他类名。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:24:03