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

如何编程获取Javax Validation校验注解的属性值

完全可以直接通过编程方式读取@Size这类校验注解的属性值,不需要硬编码常量,以下是两种可直接落地的实现方式:

方案1:Java原生反射(轻量无额外依赖)

Java的校验注解(包括Hibernate Validator实现的所有标准注解)默认都是运行时保留的,直接通过JDK自带的反射API就能读取属性值,不需要额外引入依赖或者做特殊配置。
示例代码:

import jakarta.validation.constraints.Size;
import java.lang.reflect.Field;

public class TestBean {
    @Size(max = 10)
    private String data;

    public static void main(String[] args) throws NoSuchFieldException {
        // 获取目标字段
        Field dataField = TestBean.class.getDeclaredField("data");
        // 读取字段上的@Size注解实例
        Size sizeAnnotation = dataField.getAnnotation(Size.class);
        if (sizeAnnotation != null) {
            // 直接调用注解的max()方法获取属性值
            int maxLimit = sizeAnnotation.max();
            System.out.println(maxLimit); // 输出10
        }
    }
}

注意:如果你用的是Java EE时代的旧版本校验包,把import路径替换为javax.validation.constraints.Size即可,逻辑完全一致。另外反射读取注解不需要修改私有字段的访问权限,即使字段是private修饰也能正常拿到注解实例。

方案2:Bean Validation元数据API(适配复杂校验场景)

如果你的项目里存在校验规则覆盖(比如通过validation.xml重写注解参数)、组合校验注解、类继承的校验规则,推荐直接用Hibernate Validator提供的元数据接口读取,这种方式拿到的是框架实际执行校验时用的参数值,不会和真实校验逻辑出现偏差。
示例代码:

import jakarta.validation.Validation;
import jakarta.validation.ValidatorFactory;
import jakarta.validation.metadata.BeanDescriptor;
import jakarta.validation.metadata.PropertyDescriptor;
import jakarta.validation.constraints.Size;

public class TestBean {
    @Size(max = 10)
    private String data;

    public static void main(String[] args) {
        // 初始化校验工厂(项目中可以复用全局单例的ValidatorFactory,不需要每次新建)
        try (ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) {
            BeanDescriptor beanDescriptor = factory.getValidator().getConstraintsForClass(TestBean.class);
            PropertyDescriptor propertyDescriptor = beanDescriptor.getConstraintsForProperty("data");
            
            propertyDescriptor.getConstraintDescriptors().forEach(desc -> {
                if (Size.class.equals(desc.getAnnotation().annotationType())) {
                    Size sizeAnno = (Size) desc.getAnnotation();
                    int maxLimit = sizeAnno.max();
                    System.out.println(maxLimit); // 输出10
                }
            });
        }
    }
}
选型参考
  • 只需要读取代码里显式标注在字段上的注解参数:优先选原生反射方案,代码最简单,性能开销最小
  • 存在动态校验配置、需要和框架实际校验逻辑完全对齐:选元数据API方案,避免配置覆盖导致拿到的值和实际校验规则不一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:27:20