Ответ 1
Однако эта проверка не выполняется одновременно с другими формами.
Метод поддержки bean действительно не предназначен для выполнения проверки ввода.
У кого-нибудь есть решение?
Используйте подходящий инструмент для задания; используйте обычный Validator
.
@FacesValidator("dataRangeValidator")
public class DateRangeValidator implements Validator {
// ...
}
Валидация нескольких входных значений с одним валидатором в свою очередь, тем не менее, является историей. В принципе, вы должны захватывать/передавать другой компонент или его значение в реализацию метода validate()
. В своей простейшей форме вы можете использовать <f:attribute>
для этого. Предполагая, что вы используете <p:calendar>
для выбора дат, вот конкретный пример запуска:
<p:calendar id="startDate" binding="#{startDateComponent}" value="#{bean.startDate}" pattern="MM/dd/yyyy" required="true" />
<p:calendar id="endDate" value="#{bean.endDate}" pattern="MM/dd/yyyy" required="true">
<f:validator validatorId="dateRangeValidator" />
<f:attribute name="startDateComponent" value="#{startDateComponent}" />
</p:calendar>
(обратите внимание на атрибут binding
, он делает компонент доступным в области EL на точно данном имени переменной, а также обратите внимание, что этот пример является как есть, и что вы не должны полностью привязывать его к свойству bean!)
Где dateRangeValidator
выглядит так:
@FacesValidator("dateRangeValidator")
public class DateRangeValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
if (value == null) {
return; // Let required="true" handle.
}
UIInput startDateComponent = (UIInput) component.getAttributes().get("startDateComponent");
if (!startDateComponent.isValid()) {
return; // Already invalidated. Don't care about it then.
}
Date startDate = (Date) startDateComponent.getValue();
if (startDate == null) {
return; // Let required="true" handle.
}
Date endDate = (Date) value;
if (startDate.after(endDate)) {
startDateComponent.setValid(false);
throw new ValidatorException(new FacesMessage(
FacesMessage.SEVERITY_ERROR, "Start date may not be after end date.", null));
}
}
}
Если вы используете библиотеку утилиты JSF OmniFaces, то вы также можете просто использовать ее <o:validateOrder>
компонент. Требование может быть достигнуто следующим образом без необходимости использования специального валидатора:
<p:calendar id="startDate" value="#{bean.startDate}" pattern="MM/dd/yyyy" required="true" />
<p:calendar id="endDate" value="#{bean.endDate}" pattern="MM/dd/yyyy" required="true" />
<o:validateOrder components="startDate endDate" />