Java 约束注释中的变量字段

Java 约束注释中的变量字段,java,validation,annotations,constraints,Java,Validation,Annotations,Constraints,我需要创建一个自定义约束注释,它可以访问bean的另一个字段的值。我将使用此注释来验证该字段,因为它取决于另一个字段的值,但在我定义它的方式中,编译器会说我的字段的“注释属性值”必须是一个常量表达式 我是这样定义的: @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy=EqualsFieldValidator.class) @Documented public @interf

我需要创建一个自定义约束注释,它可以访问bean的另一个字段的值。我将使用此注释来验证该字段,因为它取决于另一个字段的值,但在我定义它的方式中,编译器会说我的字段的“注释属性值”必须是一个常量表达式

我是这样定义的:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=EqualsFieldValidator.class)
@Documented
public @interface EqualsField {
    public String field();

    String message() default "{com.myCom.annotations.EqualsField.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

public class EqualsFieldValidator implements ConstraintValidator<EqualsField, String>{

    private EqualsField equalsField;

    @Override
    public void initialize(EqualsField equalsField) {
        this.equalsField = equalsField;     
    }

    @Override
    public boolean isValid(String thisField, ConstraintValidatorContext arg1) {
        //my validation
    }

}
有没有办法定义注释以便字段值可以是变量


感谢编译器所说的注释必须是常量(即,您可以在编译时确定值)。现在,如果我猜对了,那么您似乎在使用此注释来表示当通过equals字段验证程序运行时,这些字段的值应该相等。您可以采取的一种方法是使用反射。与其尝试使用值进行注释,不如使用字段名进行注释

public class MyBean{

     private String field1;

     @EqualsField("field1")
     private String field2;
}
然后在验证器中,您可以读取字段的名称并使用反射来访问它

Object o = object.getClass().getDeclaredField(annotationValue).get(object);
o == object.(field with annotation) OR
o.equals(object.(field with annotation));

根据您试图执行的操作,您可能需要添加基于字段类型的逻辑,但仍然是相同的一般原则。

最简单的方法是后退一步:您编写的约束/验证器在字段级别上工作,但您想要强制执行的是跨字段依赖关系,即类级别的约束


重写约束和验证器以在类级别工作(即注释将在类上进行,而不是在字段上)。这样你就可以访问整个班级。在isValid(..)方法中,只需对两个字段进行一次获取,比较,然后适当返回。

查看前面的问题,有多个跨字段验证解决方案:

确定,但是我如何访问EqualsFieldValidator中注释所在的对象?它是这样工作的,尽管我需要将验证错误与其中一个字段关联,如果我验证整个对象,我将得到整个对象的错误,而不是字段的错误,但无论如何,谢谢。不,不是这样。isValid方法的第二个参数ConstraintValidatorContext允许您重写该行为。您可以使用addError()方法来说明错误应该出现在特定字段中,并删除默认的类级错误。您好,您可以共享工作代码吗?这将非常有帮助。就连我也面临着同样的问题。
Object o = object.getClass().getDeclaredField(annotationValue).get(object);
o == object.(field with annotation) OR
o.equals(object.(field with annotation));