Я создал собственный валидатор для своего проекта, он просто проверяет выбранное значение и «проверяет», что значение не равно «0».У нас есть стандарт (я уверен, что это не редкость) ручной установки первого значения наших компонентов selectOneMenu на:
<f:selectItem itemValue="0"
itemLabel="-- Select One --"/>
, которое работает нормально, но затем заставляет компонент всегда проходить необходимую проверку.Таким образом, этот валидатор просто обрабатывает это значение так, как если бы выбор не был сделан.
Пример SelectOneMenu:
<h:selectOneMenu id="eligibility"
value="#{reg.eligibility}"
required="#{reg.fieldsRequired}">
<f:selectItem itemValue="0"
itemLabel="-- Select One --"/>
<f:selectItems value="#{reg.eligibilityList}" />
<f:validator validatorId="selectOneValidator"
disabled="#{!reg.fieldsRequired}"/>
Пользовательский валидатор:
@FacesValidator("selectOneValidator")
открытый класс SelectOneValidator реализует валидатор {
@Override
public void validate(FacesContext context, UIComponent uiComponent, Object o) throws ValidatorException {
String val = null;
if (uiComponent instanceof HtmlSelectOneMenu) {
HtmlSelectOneMenu oneMenu = (HtmlSelectOneMenu) uiComponent;
if (oneMenu.isRequired() && !oneMenu.isDisabled()) {
if (o instanceof String) {
val = (String) o;
} else if (o instanceof Number) {
val = String.valueOf(o);
}
if ("0".equals(val)) {
FacesMessage msg = new FacesMessage();
msg.setSummary("Please select a value from the list.");
msg.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ValidatorException(msg);
}
}
}
}
}
До сих пор это работало очень хорошо, однако в текущем сценарии использования у меня проблемы.На моей странице есть несколько SelectOneMenus, один из которых переключает обязательные и отключенные атрибуты через вызов ajax для страницы.Однако у меня нет проблем с required="#{reg.fieldsRequired}"
;атрибут disabled="#{!reg.fieldsRequired}"
моего пользовательского валидатора, похоже, не имеет значения.Я просто размышляю вслух, но при первой загрузке страницы выражение #{reg.fieldsRequired}
ложно.Если затем я изменю SelectOneMenu, чтобы установить для этого логического значения значение true, затем нажмите кнопку отправки, атрибут disabled, похоже, не был установлен.Я задавался вопросом, является ли это просто проблемой AJAX, и что все компоненты просто необходимо повторно обработать, поэтому я добавил @form в свой вызов AJAX: <a4j:ajax render="@form" listener="#{reg.saveActionChanged}"/>
в надежде, что это решит проблему, но без различий в поведении.
Среда:
JSF 2.0.3
Tomcat 6.0.14
вызов ajax, выполняемый с помощью RichFaces 4.0
Любая помощь приветствуется!