Почему я не могу получить отправленное значение из привязки компонента?

На странице register.xhtml у меня есть 2 компонента inputText для пароля и подтверждения пароля следующим образом:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xmlns:f="http://java.sun.com/jsf/core">

   <h:form>

      <h:outputText style="font-weight: bold" value="Password: " />
      <p:password feedback="true" minLength="9" 
                  binding="#{mrBean.passwordComponent}"
                  id="password" value="#{mrBean.password}"/>
      <p:message for="password" id="passwordMsg" />

      <h:outputText style="font-weight: bold" value="Confirm password: " />
      <p:password feedback="false" minLength="9" 
                  id="confirmPassword" value="#{mrBean.confirmPassword}"
                  validator="#{mrBean.validateConfirmPassword}>
         <f:attribute name="oriPassword" value="#{mrBean.passwordComponent.submittedValue}"/>
         <p:ajax process="password confirmPassword" update="confirmPasswordMsg" /> 
      </p:password>
      <p:message for="confirmPassword" id="confirmPasswordMsg" />

   </h:form>

</html>

А это мой mrBean:

@ManagedBean
@RequestScoped
public class MrBean {

    private String  password;
    private String  confirmPassword;
    private UIInput passwordComponent;

    public void validateConfirmPassword(FacesContext context, UIComponent toValidate,
            Object value) throws ValidatorException {

        String passwordStr        = (String) toValidate.getAttributes().get("oriPassword");
        String confirmPasswordStr = (String) value;

        if (!confirmPasswordStr.equals(passwordStr)) {
            FacesMessage message = new FacesMessage("The 2 passwords do not match.");
            throw new ValidatorException(message);
        }
    }

}

На другой странице у меня также есть аналогичный компонент с аналогичной функцией проверки для электронной почты и подтверждения электронной почты, и он отлично работает. Однако я понятия не имею, почему это не может работать здесь. passwordStr всегда null, хотя я уже ввел пароль.

Я был бы очень признателен, если бы кто-нибудь мог показать мне, что я сделал неправильно здесь.

С уважением, Джеймс Тран


person Mr.J4mes    schedule 03.12.2011    source источник
comment
Возможно, метод проверки должен быть validateConfirmPassword, а не validateConfirmEmail. Вы разместили правильный код?   -  person Vineet Reynolds    schedule 03.12.2011
comment
@VineetReynolds: Спасибо, что поправили меня: P. Я неправильно набрал код. Я обновил свой вопрос с правильным кодом.   -  person Mr.J4mes    schedule 03.12.2011


Ответы (1)


Компоненты JSF обрабатываются в порядке их появления в дереве компонентов. На этапе проверки для каждого компонента отправленное значение будет извлечено getSubmittedValue(), преобразовано и проверено. Если во время преобразования и проверки не возникло никаких исключений, то отправленное значение будет установлено на null, а преобразованное и проверенное значение будет установлено как локальное значение на setValue().

Вы пытаетесь сослаться на отправленное значение компонента, который уже был обработан на тот момент. Представленное значение будет не-null только в том случае, если преобразование/проверка для этого значения не удалась. Вместо этого вам нужно сослаться на его локальное значение.

<f:attribute name="oriPassword" value="#{mrBean.passwordComponent.value}"/>

Смотрите также:

person BalusC    schedule 03.12.2011
comment
Большое спасибо! Ваш ответ как всегда идеален =). - person Mr.J4mes; 03.12.2011