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

如何在Jakarta ConstraintValidator实现中获取注解标注的字段名称?

在ConstraintValidator中获取标注字段的名称(非强转实现)

有两种基于标准Bean Validation API的实现方式,无需强转ConstraintValidatorContextImpl:

方法一:通过约束违例构建器获取属性路径

在validate方法中,利用ConstraintValidatorContext的约束违例构建器获取当前校验的属性路径,进而提取字段名:

public class MyConstraintValidator implements ConstraintValidator<MyConstraint, String> {

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 构建空约束违例以获取属性路径(不会实际抛出)
        Path propertyPath = context.getConstraintViolationBuilder()
                .buildConstraintViolationWithTemplate("")
                .getPropertyPath();
        
        // 提取路径中的字段名称
        String fieldName = propertyPath.iterator().next().getName();
        
        // 在这里使用fieldName执行校验逻辑
        // 示例:若字段为state且值为空则校验不通过
        if ("state".equals(fieldName) && value == null) {
            return false;
        }
        
        return true;
    }
}

方法二:通过ConstraintDescriptor获取标注元素

如果自定义注解仅标注在字段上,可在validate方法中通过ConstraintDescriptor获取被标注的Field实例,直接拿到字段名:

public class MyConstraintValidator implements ConstraintValidator<MyConstraint, String> {

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        AnnotatedElement annotatedElement = context.getConstraintDescriptor().getElement();
        if (annotatedElement instanceof Field) {
            String fieldName = ((Field) annotatedElement).getName();
            
            // 使用fieldName执行校验逻辑
            System.out.println("当前校验字段:" + fieldName);
        }
        
        return true;
    }
}

注意:若注解可能标注在方法、参数等其他元素上,需额外添加类型判断逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:43:10