由于FacesValidator,ManageBean方法不再适用?

问题描述:

我在密码验证方面遇到了一些问题,@BalusC帮我解决了here。 但我在我的表单中插入验证码后,当我调用控制器方法时,没有任何反应。 这里去我的JSF页面: Register.xhtml由于FacesValidator,ManageBean方法不再适用?

<!DOCTYPE html> 
<html lang="pt-br" 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:a4j="http://richfaces.org/a4j" 
    xmlns:rich="http://richfaces.org/rich"> 

    <h:head> 
     <title>TITLE</title> 
    </h:head> 

    <h:body> 
     <h:form id="form"> 
      <h:panelGrid columns="3" > 

       <h:outputLabel for="name" value="Nome:" /> 
       <h:inputText id="name" value="#{register.person.name}" > 
        <f:ajax event="blur" listener="#{register.validateName}" render="m_name" /> 
       </h:inputText> 
       <rich:message id="m_name" for="name" ajaxRendered="false"/> 

       // some fields ..      

       <h:outputLabel for="password" value="Password" /> 
       <h:inputSecret id="password" value="#{register.user.password}"> 
        <f:validator validatorId="confirmPasswordValidator" /> 
        <f:attribute name="confirm" value="#{confirmPassword.submittedValue}" /> 
        <f:ajax event="blur" execute="password confirm" render="m_password" /> 
       </h:inputSecret> 
       <rich:message id="m_password" for="password" /> 

       <h:outputLabel for="confirm" value="Senha (novamente):" /> 
       <h:inputSecret id="confirm" binding="#{confirmPassword}" > 
        <f:ajax event="blur" execute="password confirm" render="m_password m_confirm" /> 
       </h:inputSecret> 
       <rich:message id="m_confirm" for="confirm" /> 

       <h:commandButton value="Register" action="#{register.registerPerson}" > 
        <f:ajax execute="@form" render="@form" /> 
       </h:commandButton> 

       <h:outputText value="#{register.recordStatus}" id="out" /> 
       <a4j:status> 
        <f:facet name="start"> 
         <h:graphicImage name="loader.gif" library="image"/> 
        </f:facet> 
       </a4j:status>  
     </h:panelGrid> 
    </h:form> 
    </h:body> 
</html> 

所以,当我填写表格,并尝试注册,没有任何反应,甚至没有任何例外,它的lauched。

的passwod验证(感谢BalusC队友):

@FacesValidator("confirmPasswordValidator") 
public class ConfirmPasswordValidator implements Validator { 

    @Override 
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
     String password = (String) value; 
     String confirm = (String) component.getAttributes().get("confirm"); 

     if (password == null || confirm == null) { 
      return; // Just ignore and let required="true" do its job. 
     } 

     if (!password.equals(confirm)) { 
      throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, null, "password not equal")); 
     }else{ 
      throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_INFO, null, "ok")); 
     } 
    } 

} 

我觉得这个问题很奇怪,我真的不知道这里发生了什么。 谢谢你们。

您在成功的比赛中投掷了ValidatorException

if (!password.equals(confirm)) { 
    throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, null, "password not equal")); 
} else { 
    throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_INFO, null, "ok")); 
} 

这会导致JSF阻止表单提交。严重程度并不重要。验证器异常是验证器异常。它表明一个变化失败。

取而代之的是使用FacesContext#addMessage()

if (!password.equals(confirm)) { 
    throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, null, "password not equal")); 
} else { 
    context.addMessage(component.getClientId(), new FacesMessage(FacesMessage.SEVERITY_INFO, null, "ok")); 
} 
+0

谢谢老兄!你真棒 –

+0

不客气。 – BalusC