JSF: проверить значение в обоих полях или ни в одном из них - PullRequest
2 голосов
/ 20 сентября 2010

У меня есть два поля, представляющих диапазон данных («от» и «до»). Мне нужно проверить, заполнены ли оба поля ни на одном из них, поэтому только в тот момент, когда должно появиться подтверждающее сообщение, это когда одно заполнено, а не второе. Как я могу это сделать? Я добавил этот пользовательский валидатор и добавил его в оба поля (поскольку JSF не проверяет пустые поля), но он всегда показывает, что они недействительны.

public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
  String otherControlId = (String) component.getAttributes().get("otherControlId");
  UIInput otherControlInput = (UIInput) context.getViewRoot().findComponent(otherControlId);
  Object otherControlValue = otherControlInput.getValue();
  if ((value == null && otherControlValue != null) || (value != null && otherControlValue == null)) {
 //show message
  }
}

otherControlId указывает на второй идентификатор элемента управления, и я получаю элемент управления в валидаторе. Но otherControlValue всегда равно нулю.

1 Ответ

2 голосов
/ 20 сентября 2010

Компоненты обрабатываются в том порядке, в котором они отображаются в дереве компонентов.Таким образом, если otherControlInput появляется после текущего проверенного компонента в дереве компонентов, то он еще не обработан.Затем вам нужно будет получить доступ к его (непроверенному и непроверенному!) Значению по UIInput#getSubmittedValue() вместо UIInput#getValue().

Object otherControlValue = otherControlInput.getSubmittedValue();

Альтернативой являетсявалидатор в другом компоненте (тот, который появляется последним в дереве) вместо текущего компонента, тогда вы можете получить значение по UIInput#getValue().

Совершенно другая альтернатива - requiredатрибут зависит друг от друга:

<h:inputText binding="#{from}" value="#{bean.from}" required="#{not empty to.submittedValue}" />
<h:inputText binding="#{to}" value="#{bean.to}" required="#{not empty from.value}" />
...