约束注释中的变量字段

Jav*_*avi 13 java validation annotations constraints

我需要创建一个自定义约束注释,它可以访问我的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
    }

}
Run Code Online (Sandbox Code Playgroud)

在我的豆子里我想要这样的东西:

public class MyBean{

     private String field1;

     @EqualsField(field=field1)
     private String field2;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法定义注释,所以字段值可以是变量?

谢谢

Gar*_*ryF 13

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

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