【问题标题】:Skip validation conditionally JSF有条件地跳过验证 JSF
【发布时间】:2012-11-05 21:30:23
【问题描述】:

要求是有条件地跳过字段验证。当用户选择添加时,应验证表单字段并将值添加到表中。 如果单击编辑,则应跳过表单字段验证,但应将 bean 值复制到输入字段。

<composite:nameInput id="name" value="#{buyer.name}" 
  disableBeanValidation ="#{param['skipBeanValidation']}"/>
<h:commandLink action="#{buyerBacking.cancelEdit}" value="cancel"/>

 <h:dataTable value="#{bean.list}">
    <h:commandLink value="Edit" action="#{buyerBacking.edit}">
     <f:param name="skipBeanValidation" value="true" /> 
    </h:commandLink>
 </h:dataTable>

   <h:commandLink id="add" action="#{buyerBacking.add}"/>

名称输入复合组件

<h:inputText id="fName" value="#{bean.fname}">
     <f:validateBean disabled="#{cc.attrs. disableBeanValidation}"/>
</h:inputText>

如果用户输入详细信息并选择添加,则将详细信息添加到表中。 如果验证错误,我们会显示错误消息。

然后用户选择编辑,值被复制到输入字段。 用户选择取消编辑,值将从输入字段中删除。 如果用户再次选择编辑,我们会得到一个 index out of bound 异常错误。 name_firstName 的索引超出范围异常。

但如果用户选择添加并选择取消编辑,则不会发生这种情况。 它是否与传递的视图参数有关,它以某种方式为空?

javax.faces.FacesException:为 ID 为 frmAddAuthBuyerBR_inpAuthBuyerBRName_prefix_input 的组件恢复状态时出现意外错误。原因:java.lang.IndexOutOfBoundsException:索引:0,大小:0。 在 com.sun.faces.application.view.StateManagementStrategyImpl$2.visit(StateManagementStrategyImpl.java:272) 在 com.sun.faces.component.visit.FullVisitContext.invokeVisitCallback(FullVisitContext.java:151) 在 javax.faces.component.UIComponent.visitTree(UIComponent.java:1612) 在 javax.faces.component.UIComponent.visitTree(UIComponent.java:1626) 在 javax.faces.component.UIComponent.visitTree(UIComponent.java:1626) 在 javax.faces.component.UINamingContainer.visitTree(UINamingContainer.java:163) 在 javax.faces.component.UIComponent.visitTree(UIComponent.java:1626) 在 javax.faces.component.UIComponent.visitTree(UIComponent.java:1626) 在 javax.faces.component.UIComponent.visitTree(UIComponent.java:1626) 在 javax.faces.component.UIComponent.visitTree(UIComponent.java:1626) 在 javax.faces.component.UINamingContainer.visitTree(UINamingContainer.java:163) 在 javax.faces.component.UIComponent.visitTree(UIComponent.java:1626) 在 javax.faces.component.UIComponent.visitTree(UIComponent.java:1626) 在 javax.faces.component.UIComponent.visitTree(UIComponent.java:1626) 在 javax.faces.component.UIForm.visitTree(UIForm.java:371) 在 javax.faces.component.UIComponent.visitTree(UIComponent.java:1626)

【问题讨论】:

    标签: jsf-2


    【解决方案1】:

    您的代码不完整,因为您无处显示disableBeanValidation 是如何实现的,以及您如何传递#{param[skipBeanValidation]}

    但它应该基本上归结为:

    <f:validateBean disabled="#{param.skipBeanValidation}" />
    
    ...
    
    <h:commandLink value="Edit" action="#{buyerBacking.edit}"/>
        <f:param name="skipBeanValidation" value="true" />
    </h:commandLink>
    

    请注意#{param.skipBeanValidation}#{param[skipBeanValidation]} 完全不同(但与#{param['skipBeanValidation']} 相同)。另请注意,跳过 bean 验证所需的请求参数作为 HTTP 请求参数传递,正如 #{param} 所期望的那样。

    【讨论】:

    • 我已经更新了我的问题中的代码。我的编码方式与您建议的相同,但正如问题中所问的那样,选择取消,然后选择编辑导致 indexoutof 绑定异常。
    • 堆栈跟踪会很有帮助。
    • 添加了堆栈跟踪。如果需要更多信息,请告诉我。即使我将禁用的值硬编码为 true。它仅适用于第一次。单击取消然后编辑时,即使禁用为真,也会进行验证。对于 Cancel 方法,我返回一个空字符串。
    • 这是一个相当严重的问题。您是否在动态创建组件?你在某处使用binding 吗?
    • 我们的代码中没有使用绑定。而且组件是基于标志呈现的,但不是动态创建的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    相关资源
    最近更新 更多