如何在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
相关产品推荐
相关产品推荐

