要求是有条件地跳过字段验证。当用户选择添加时,应验证表单字段并将值添加到表中。
如果单击了edit,则应跳过表单字段验证,但应将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>


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

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

但是,如果用户选择添加并选择取消编辑,则不会发生这种情况。
它与通过某种方式传递null的view参数有关吗?

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)

最佳答案

您的代码不完整,因为您无处显示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']}相同)。还请注意,与#{param}所期望的一样,跳过Bean验证所需的请求参数已作为HTTP请求参数传递。

09-25 20:36