DateValidator.minimum(startdateField.getModel().getObject())
не работает, потому что во время создания страницы Модель startdateField
не содержит значения, которое отправляет пользователь, и которое должно учитываться как минимальное во время проверки.
Обычно, если ваша проверка включает более одного компонента, целесообразно использовать IFormValidator
. Его метод validate()
будет вызываться после успешного вызова каждого зависимого индивидуума FormComponent.validate()
, поэтому вы гарантированно получите действительные индивидуальные входные данные для каждого зависимого компонента, прежде чем приступить к проверке их в целом.
Одним из важных аспектов проверки является предотвращение попадания недействительного пользовательского ввода в Модели Компонента. Поэтому во время проверки Модели еще не будут обновлены, и вместо FormComponent.getModelObject()
вам придется использовать FormComponent.getInput()
или FormComponent.getConvertedInput()
в методе validate()
.
IFormValidator validator = new AbstractFormValidator() {
public FormComponent<?>[] getDependentFormComponents() {
return new FormComponent[] { startDateField, endDateField };
}
public void validate(Form<?> form) {
Date startDate = (Date) startDateField.getConvertedInput();
Date endDate = (Date) endDateField.getConvertedInput();
if (endDate.before(startDate)){
error("Date range is invalid.");
}
}
};
form.add(validator);
Примите во внимание, что если какой-либо из компонентов FormComnel в getDependentFormComponents()
недействителен (и это означает, что он невидим, необходим и не имеет ввода, не проходит индивидуальную проверку и т. Д.), FormValidator
не выполнится.
Вы также можете найти эту информацию полезной: Проверка связанных полей