【问题标题】:JSF validation error message displayed after manual validation in bean在 bean 中手动验证后显示 JSF 验证错误消息
【发布时间】:2013-11-19 11:01:33
【问题描述】:

我正在学习 JSF,在理解 JSF 验证方面需要一些帮助。我正在尝试借助“http://courses.coreservlets.com/”在同一页面中进行手动、隐式和显式验证。 我用下面的验证写了 2 个输入字段。

Customer Name: <h:inputText value="#{bean.customerName}" required="true" />         
       Account No: <h:inputText value ="#{bean.accountNo}" > 
        <f:validateLength minimum="10"></f:validateLength>
       </h:inputText>          
       <h:commandButton value="Submit" action="#{bean.actionValidate}"></h:commandButton>          
       <h:messages globalOnly="true"></h:messages>

public String actionValidate(){     
    FacesMessage fcMessage = new FacesMessage();
    if(getAccountNo().isEmpty() || getAccountNo() == null) {
        fcMessage.setSummary("account no empty");
        fcContext.addMessage(null, fcMessage);
    }       
    if (fcContext.getMessageList().size()>0)
        return null;
    else
        return "ManualValidationResult";
}

我的理解是字段 1 的 required 属性和 f:validateLength 验证将在 Process & Validation 阶段进行,如果验证失败,生命周期会进入 Render 响应阶段并首先显示错误消息。一旦通过,就应该执行 bean 验证 - 理想情况下,在我的示例中,bean 中的验证不会被执行。但是,我得到了 “客户名 - 验证错误:值是必需的。”如果两个字段都留空。

我填写了名称字段,现在我收到“account no empty”消息,然后如果在 account no 字段中输入了某个值,则会收到“验证错误:长度小于允许的最小值 '5'”。

谁能帮我理解一下流程?

【问题讨论】:

    标签: validation jsf


    【解决方案1】:

    事实 1:在 INVOKE_APPLICATION 阶段调用操作方法。

    事实 2:当标准验证在 PROCESS_VALIDATIONS 阶段失败时,随后的 UPDATE_MODEL_VALUES 和 INVOKE_APPLICATION 阶段将被跳过,JSF 将直接继续执行 RENDER_RESPONSE 阶段。

    逻辑结果:当标准验证失败时,永远不会调用操作方法。这是一件好事。绝不应使用无效输入执行业务逻辑。

    解决方案很简单:不要在操作方法中进行验证。我知道本教程是示例性的,但在现实世界中你应该避免这种情况。而不是

    <h:inputText value ="#{bean.accountNo}"> 
    

    你应该使用

    <h:inputText value ="#{bean.accountNo}" required="true" requiredMessage="account no empty">
    

    并从操作方法中删除所有验证逻辑。事实上,你的整个动作方法是没有用的。您可以只在命令按钮中使用action="ManualValidationResult"action 在验证失败时无论如何都不会被调用,因此当验证失败时也不会执行导航。

    【讨论】:

    • 感谢您的宝贵时间。我同意行动方法没有意义。但我只是在尝试所有 JSF 功能。我还不清楚,正如您所说,当我将字段留空时,标准验证(这里 - 需要验证和 f:validateLength minimum="10")应该在操作调用之前执行,这意味着我应该得到
    • 这也是怎么回事?您的问题至少准确地描述了这一点。客户名称字段根本没有在 action 方法中验证。
    • 对不起,代码,我希望输出为。 1.leave customer name & acc no blank-我应该得到错误消息“Value is required” for customer name “Length is less than allowed minimum 5” for acc no 2.now 填写两个字段,下一页显示,但我是什么得到是。 1.leave cust name & acc no blank "Value is required" for cust name is shown but-"Length is less than allowed minimum 5" is not shown 2. 填写客户名称并留空 acc no blank "account no empty" is在行动调用 3 之后显示。 填写 acc no 也“长度小于允许的最小值 5” 以显示 acc no。这是正确的吗?
    【解决方案2】:

    f:validatelength 仅在某个值与该字段关联时才有效。如果输入字段为空,则 LengthValidator 不会进行任何验证。来自 LengthValidator 的一段代码...

    // VALIDATE
     public void More ...validate(FacesContext facesContext,
                          UIComponent uiComponent,
                          Object value)
             throws ValidatorException
     {
         if (facesContext == null) throw new NullPointerException("facesContext");
         if (uiComponent == null) throw new NullPointerException("uiComponent");
    
         if (value == null)
         {
             return;
         }
    // length validation code here...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 2021-12-19
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 2019-06-11
      • 1970-01-01
      相关资源
      最近更新 更多