Не следует ли пропустить проверку, если не указано значение? - PullRequest
8 голосов
/ 24 мая 2011

Я использую JSF2 на GlassFish 3.

У меня есть форма, которая принимает и дополнительный номер телефона. У меня есть этот пользовательский валидатор телефонных номеров (ниже), и у меня установлено поле required = "false", потому что номер телефона в форме не обязателен.

Проблема в том, что значение в поле всегда проверяется. Разве проверка не должна быть пропущена, если не указано значение?

Должно быть, я что-то не так делаю. Любая помощь приветствуется, спасибо!

<h:outputText value="#{msg.profile_otherPhone1Label}#{msg.colon}" />
  <h:panelGroup>
    <p:inputText label="#{msg.profile_otherPhone1Label}" id="otherPhone1" value="#{profileHandler.profileBean.otherPhone1}" required="false">
      <f:validator validatorId="phoneValidator" />
    </p:inputText>
  <p:spacer width="12"/>
  <h:outputText value="#{msg.profile_phoneExample}" />
</h:panelGroup>

#

public class PhoneValidator implements Validator {

    @Override
    public void validate(FacesContext facesContext, UIComponent uIComponent,
            Object object) throws ValidatorException {

        String phone = (String) object;

        // count the digits; must have at least 9 digits to be a valid phone number
        // note: we're not enforcing the format because there can be a lot of variation
        int iDigitCount = 0;
        for (char c : phone.toCharArray()) {
            if (Character.isDigit(c)) {
                iDigitCount++;
            }
        }

        if (iDigitCount < 9) {
            FacesMessage message = new FacesMessage();
            message.setSummary(Messages.getMessage("error_phoneNumberNotValid"));
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            throw new ValidatorException(message);
        }
    }

}

1 Ответ

23 голосов
/ 24 мая 2011

Начиная с JSF 2.0, JSF по умолчанию будет также проверять пустые поля, чтобы хорошо играть с новым Java EE 6, предоставленным API-интерфейсом проверки bean-компонентов JSR 303, который предлагает среди прочих @NotNull и далее.

Есть два основных способа обойти это:

  1. Скажите JSF не проверять пустые поля с помощью следующей записи в web.xml.

    <context-param>
        <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
        <param-value>false</param-value>
    </context-param>
    

    Недостаток очевиден: вы больше не можете использовать Bean-компонент JSR 303. на его полной мощности.


  2. Проверьте себя в Validator.

    if (object == null) return;
    

    Если у вас нет контекстного параметра javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL, установленного на true, то вы бы хотели привести к String и также проверить isEmpty().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...