Конвертер JSF приводит к игнорированию валидатора(ов)

Вот поле:

<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));
        }
    }
}

Когда я нажимаю командную кнопку в форме, я получаю следующее поведение:

  • Когда поле пустое, сообщение "Not valid (converter)".
  • Когда в поле есть действительная запись, сообщение "Недействительно (валидатор)".
  • Если в поле есть недопустимая запись, сообщение будет "Недействительно (конвертер)".

Во всех трех случаях вызывается MobilePhoneNumberConverter.getAsObject(). MobilePhoneNumberValidator.validate() никогда не вызывается. А когда поле пустое, он игнорирует атрибут required="true" и сразу переходит к преобразованию.

Я бы подумал, что правильное поведение должно быть таким:

  • Когда поле пустое, сообщение должно быть "Required".
  • Когда в поле есть допустимая запись, сообщение вообще не должно появляться.
  • Когда поле содержит недействительную запись, сообщение должно быть "Недействительно (валидатор)".
  • Если по какой-то случайности валидация прошла, а конвертация не прошла, то сообщение должно быть "Not valid (converter)".

Примечание: бобы подкрепления привязаны к запросу, поэтому здесь не происходит никаких причудливых AJAX-действий.

Обновление:

Возможно, это как-то связано с тем, что javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL установлен в true?

6
задан Distortum 4 January 2012 в 00:53
поделиться