Вот поле:
<h:inputText id="mobilePhoneNo"
value="#{newPatientBean.phoneNo}"
required="true"
requiredMessage="Required"
validator="#{mobilePhoneNumberValidator}"
validatorMessage="Not valid (validator)"
converter="#{mobilePhoneNumberConverter}"
converterMessage="Not valid (converter)"
styleClass="newPatientFormField"/>
И валидатор:
@Named
@ApplicationScoped
public class MobilePhoneNumberValidator implements Validator, Serializable
{
@Override
public void validate(FacesContext fc, UIComponent uic, Object o) throws ValidatorException
{
// This will appear in the log if/when this method is called.
System.out.println("mobilePhoneNumberValidator.validate()");
UIInput in = (UIInput) uic;
String value = in.getSubmittedValue() != null ? in.getSubmittedValue().toString().replace("-", "").replace(" ", "") : "";
if (!value.matches("04\\d{8}"))
{
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Please enter a valid mobile phone number.", null));
}
}
}
Когда я нажимаю командную кнопку в форме, я получаю следующее поведение:
Во всех трех случаях вызывается MobilePhoneNumberConverter.getAsObject()
. MobilePhoneNumberValidator.validate()
никогда не вызывается. А когда поле пустое, он игнорирует атрибут required="true"
и сразу переходит к преобразованию.
Я бы подумал, что правильное поведение должно быть таким:
Примечание: бобы подкрепления привязаны к запросу, поэтому здесь не происходит никаких причудливых AJAX-действий.
Обновление:
Возможно, это как-то связано с тем, что javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL
установлен в true
?