java - 约束注释中的变量字段

标签 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
    }

}

在我的 bean 中,我想要这样的东西:

public class MyBean{

     private String field1;

     @EqualsField(field=field1)
     private String field2;
}

有什么方法可以定义注解,使字段值可以是变量吗?

谢谢

最佳答案

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

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

关于java - 约束注释中的变量字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2469473/

相关文章:

java - 修复 Eclipse 中的模块 {a} 不会 "opens {package}"到模块 {B}

javascript - Parsleyjs 日期验证不适用于像 Onchange 这样的 Datepicker 事件

javascript - 手动设置自定义验证消息时如何触发 HTML5 验证错误弹出窗口?

java - 读取另一个注释中的属性

java - 设计自定义注释来调用 jar 中的方法

android - Unresolved reference : Kotlin needs 2 builds after clean to pick up code when using kapt

java - 如何在Java中的QUICKFIX中将字符串转换为MarketDataIncrementalRefresh?

java - JDBC - 一个查询返回单独的结果组

java - BlueJ 中我无法弄清楚的编译错误

validation - Angular 2 从自定义验证器中检索错误消息