У меня есть форма с двумя полями ввода , которые должны быть проверены вместе . Я использовал этот BalusC учебник в качестве отправной точки.
Требование является логическим XOR: одно из полей должно быть заполнено, но не оба вместе .
Это прекрасно работает для всех случаев, кроме этого:
1) Заполните первое поле и оставьте второе пустым
2) Перейти к следующей странице (значения сохраняются)
3) Вернитесь на первую страницу, удалите первое поле и заполните второе поле .
Затем я получаю сообщение об ошибке от моего валидатора («Не заполняйте оба поля»), хотя я удалил первое.
Вот код:
<h:inputText id="bbvol" size="10" value="#{a6.behandlungsvolumen.wert}"
required="#{empty param['Laborwerte:pvol']}">
<f:convertNumber locale="de"/>
</h:inputText>
<h:inputText id="pvol" size="10" value="#{a6.plasmavolumen.wert}"
required="#{empty param['Laborwerte:bbvol']}">
<f:convertNumber locale="de"/>
<f:validator validatorId="volumeValidator" for="pvol"/>
<f:attribute name="bbv_value" value="Laborwerte:bbvol" />
</h:inputText>
VolumeValidator:
public class VolumeValidator implements Validator {
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
// Obtain the client ID of the first volume field from f:attribute.
String bbvolID = (String) component.getAttributes().get("bbv_value");
// Find the actual JSF component for the client ID.
UIInput bbvolInput = (UIInput) context.getViewRoot().findComponent(bbvolID);
// Get its value, the entered value of the first field.
Number bbvol = (Number) bbvolInput.getValue();
// Get the value of the second field
Number pvol = (Number) value;
// Check if only one of the fields is set
if (bbvol != null && pvol != null) {
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Do not fill both fields!", null));
}
}
}
Отладка этого случая показывает, что строка
Number bbvol = (Number) bbvolInput.getValue();
все еще содержит старое значение, а не новое.
Я пытался использовать getSubmittedValue()
вместо getValue()
и , это работает . Но Javadoc для этого метода говорит:
Этот метод должен использоваться только
decode () и validate () метод этого
компонент или его соответствующий
Renderer.
Я не уверен, что смогу использовать этот метод без проблем в дальнейшем.
Итак, мои вопросы:
В чем причина этой проблемы?
Является ли использование getSubmittedValue()
вместо getValue()
реальным решением?