具有操作属性条件验证检查的复合组件在还原视图阶段抛出ClassCastException

时间:2016-10-13 15:48:01

标签: validation jsf jsf-2 action composite-component

我有一个JSF复合组件(名称面板)。在该组件中,我使用的是customValidator,如下所示:

<h:inputHidden id="nameValidator" value="true">
    <f:validator validatorId="NameValidator"
                            disabled="#{!cc.attrs.nameRequired}" />
    <f:attribute name="firstName" value="firstName" />
    <f:attribute name="lastName" value="lastName" />
</h:inputHidden>

firstNamelastName是此JSF表单上的两个输入文本。并且nameRequired属性从我们放置此复合组件的位置传递。

我正在使用如下所示的复合组件:

<util:NamePanel viewbean="#{BACKING_BEAN}"
    nameDTO="#{BACKING_BEAN.nameDTO}"
    nameRequired="#{param['requireValidation']=='1' " />

在我的屏幕上,我有两个按钮。但我想验证名称只按下保存按钮,并希望按下取消按钮跳过验证。为此我已经应用了条件验证。

<h:commandButton value="Cancel"
        action="#{BACKING_BEAN.doCancel}">
    <f:param name="requireValidation" value="0"></f:param>
</h:commandButton>

<h:commandButton value="Save"
        action="#{BACKING_BEAN.doSave}">
    <f:param name="requireValidation" value="1"></f:param>
</h:commandButton>

所以当我按下Save按钮时。通过调用自定义验证器来验证名称,但在此之后,当JSF恢复视图阶段尝试在数据库中保存数据后恢复页面时,它会抛出以下错误:

Caused by: java.lang.IllegalStateException: Error restoring component: nameValidator
       at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.restoreStateFromMap(DefaultFaceletsStateManagementStrategy.java:518)

Caused by: java.lang.ClassCastException: package.NameValidator incompatible with javax.faces.component.StateHolder
       at javax.faces.component._DeltaList.restoreState(_DeltaList.java:222)
       at javax.faces.component.UIInput.restoreState(UIInput.java:1047)

但是当我在我的表单中放置复合组件的地方用nameRequired="#{param['requireValidation']=='1'"替换nameRequired="true"时,它完全正常。

无法理解其原因,也无法找到解决此问题的方法。或者其他一些方法来实现这一目标。

0 个答案:

没有答案