#jsf #jsf-2 #validation
#jsf #jsf-2 #проверка
Вопрос:
Я использую 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:
Начиная с JSF 2.0, JSF по умолчанию также будет проверять пустые поля, чтобы хорошо работать с новым Java EE 6, предоставляемым JSR 303 Bean Validation API, который предлагает среди прочего @NotNull
и далее.
В принципе, есть два способа обойти это:
-
Скажите JSF, чтобы он не проверял пустые поля следующей записью в
web.xml
.<context-param> <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name> <param-value>false</param-value> </context-param>
Недостаток очевиден: вы больше не можете использовать проверку компонента JSR 303 на полную мощность.
-
Выполните проверку на нуль самостоятельно в
Validator
.if (object == null) return;
Если у вас нет
javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL
параметра контекста, для которого установлено значениеtrue
, то вы также хотели бы привести кString
и проверитьisEmpty()
.