2

Рассмотрим ниже образец, который проверяет, является ли fromDate и toDate являются действительными даты и если fromDate меньше toDate:Как закоротить @CustomValidator?

@CustomValidator(type = "DateValidator", 
      fieldName = "fromDate", 
     shortCircuit = true), 

@CustomValidator(type = "DateValidator", 
      fieldName = "toDate", 
     shortCircuit = true), 

@CustomValidator(type = "CompareDatesValidator", 
       message = "validate.date.jalali.same.or.before", 
     shortCircuit = true, 
      parameters = { 
     @ValidationParameter(name = "fromDateParam", value = "${fromDate}"), 
     @ValidationParameter(name = "toDateParam", value = "${toDate}") 
       }) 

DateValidator расширяет FieldValidatorSupport и CompareDatesValidator расширяет ValidatorSupport

Хотя я shortCircuit в DateValidator s, но CompareDatesValidator всегда запускаются, что является неправильным. Могу ли я исправить это?!

+0

Это ответ на ваш вопрос? Из документов: «Обычный валидатор имеет приоритет над полем-валидатором. Они проверяются сначала в том порядке, в котором они определены, а затем в валидаторе поля в том порядке, в котором они определены. Неисправность конкретного валидатора, отмеченного как короткое замыкание, предотвратит оценку последующих валидаторов, и ошибка проверки (ошибка действия или ошибка поля в зависимости от типа валидатора) будет добавлена ​​в ValidationContext проверяемого объекта. –

+0

@AleksandrM спасибо, что я это видел, но, к сожалению, это не помогло.Валидация должна быть короткой, но это не так! –

+0

'Обычный валидатор имеет приоритет над полем-валидатором'. - Сначала будет выполнен ваш' CompareDatesValidator'. Значение короткого замыкания произойдет только после этого. Преобразуйте его в полевой валидатор, и он должен работать так, как вы хотите. –

ответ

2

Как пояснил in the documentation.

Простой валидатор имеет преимущество перед полевым валидатором. Они проверяются сначала в том порядке, в котором они определены, а затем в валидаторе поля в том порядке, в котором они определены. Отказ конкретного валидатора, отмеченного как короткое замыкание, предотвратит оценку последующих валидаторов и ошибку (ошибку действия или ошибку поля в зависимости от типа проверки) будет добавлен в ValidationContext проверяемого объекта.

Тогда ваш фактический порядок выполнения:

  1. CompareDatesValidator (обычная)
  2. DateValidator (поле fromDate)
  3. DateValidator (поле toDate)

Проблема в том, что он будет выполнен первым, но поскольку его проверка является составной проверкой, основанной на двух полях, сначала должна выполняться атомная проверка самих полей.

Но это как работает структура, поэтому вам нужно обходного это.

Если your plain validator is still this one (даже если с some modification), вы можете избежать проверки и игнорировать ошибку в случае, если вход не действует, позволяя это проверка произойдет, где она принадлежит, в поле валидаторов:

public final class CompareDatesValidator extends ValidatorSupport { 
    private String fromDate; // getter and setter 
    private String toDate; // getter and setter  

    @Override 
    public void validate(Object o) throws ValidationException { 
     Date d1 = (Date)parse(fromDate, Date.class); 
     Date d2 = (Date)parse(toDate, Date.class); 

     if (d1==null || d2==null){ 
      LOG.debug("Silently disabling Plain Validator. Check performed by Field ones"); 
     } else if (d2.before(d1)){ 
      addActionError(getDefaultMessage()); 
     } 
    } 
} 

Вам нужно только помнить, чтобы всегда ставить полевые валидаторы в том же стеке проверки CompareDatesValidator, или «Дата недействительна» ошибки будут проглатываться без пауз.

+1

«DateValidator» - это сложные функции, поэтому я возвращаю 'DateValidator' в' CompareDatesValidator'. Например: 'if (! Valid (d1) ||! Valid (d2)) {LOG.debug (« Молчаливое отключение Plain Validator. Проверка выполняется с помощью полей »);}' Спасибо за ответ –

Смежные вопросы