【问题标题】:Cross field validation based on value基于值的跨字段验证
【发布时间】:2012-07-29 02:13:29
【问题描述】:

如果我们要构建一个自定义的 JSR 303 验证器,有什么方法可以将字段的值而不是字段的名称传递给验证器?

这就是我正在做的事情..

我需要构建一个自定义类级别的验证来验证这种情况..

有两个字段 A 和 B,其中 B 是日期字段。如果 A 的值为 1,则验证 B 不为空且其值为未来日期。

现在我能够在this 发布后根据这些要求构建验证。在 FutureDateValidator 的 isValid() 方法中,我检查了 A 的值是否为 1,然后检查了日期的有效性。

@CustomFutureDate(first = "dateOption", second = "date", message = "这必须是未来的日期。")

现在我有了一组新的字段 C 和 D,其中 D 又是日期字段。这一次,如果 C 的值为 2,我需要验证 D 是否为未来日期。在这种情况下,我不能使用我已经实现的验证器,因为它具有硬编码的第一个字段的值。那么我该如何解决这个问题,以便为这两种情况重用相同的验证器。

【问题讨论】:

    标签: spring bean-validation


    【解决方案1】:

    不要硬编码值 1/2 使其可自定义:

    @CustomFutureDate(first = "dateOption", firstValue = "1", second = "date", message = "This must be a future date.")
    

    要让它工作,你需要修改@CustomFutureDate注解:

    public @interface CustomFutureDate {
        String first();
        String firstValue();
        ...
    }
    

    和实施:

    public class CustomFutureDateValidator implements ConstraintValidator<CustomFutureDate, Object> {
        private String firstFieldName;
        private String firstFieldValue;
        ...
    
        @Override
        public void initialize(final CustomFutureDate constraintAnnotation) {
            firstFieldName = constraintAnnotation.first();
            firstFieldValue = constraintAnnotation.firstValue();
            ...
        }
    
        @Override
        public boolean isValid(final Object value, final ConstraintValidatorContext context) {
            // use firstFieldValue member
            ...
        }
    }
    

    【讨论】:

    • 感谢 php-coder。我没有尝试这个,因为我过去几天不在办公室。肯定会利用它。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 2015-07-24
    • 1970-01-01
    • 2017-09-08
    • 2019-03-24
    相关资源
    最近更新 更多