如何编程获取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
相关产品推荐
相关产品推荐

