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

如何使用javax的ConstraintValidator对非String值进行自定义校验?

问题分析与解决

错误根源

你的代码核心问题是泛型类型不匹配:

  • 类声明时指定的ConstraintValidator<Custom, String>,第二个泛型参数为String,意味着该校验器的目标校验类型是String
  • 但你重写的isValid方法第一个参数却是CustomerResource,与泛型约定的类型完全不符,编译器因此判定该方法未正确覆盖父类方法,抛出Method does not override method from its superclass错误

你的理解误区

  • 误以为JSR-380(javax.validation)仅支持校验String类型:实际上它支持对任意自定义对象做校验,只要泛型参数配置正确。
  • 泛型与方法参数的对应关系理解错误:ConstraintValidator<A, T>中,第二个泛型参数T必须和isValid(T value, ConstraintValidatorContext context)的第一个参数类型完全一致,才能正确完成方法覆盖。

修正后的代码示例

// 将泛型第二个参数改为CustomerResource,与isValid方法的参数类型匹配
public class PersonConstraint implements ConstraintValidator<Custom, CustomerResource> {

    @Override
    public void initialize(Custom constraintAnnotation) {
        ConstraintValidator.super.initialize(constraintAnnotation);
    }

    @Override
    public boolean isValid(CustomerResource value, ConstraintValidatorContext context) {
        // 编写你的自定义校验逻辑
        return false;
    }
}

额外说明

自定义校验器的泛型参数T可以是任意类型,包括自定义实体类、包装类、集合等,只要保证isValid方法的第一个参数类型与T严格一致即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:01:27