我有一个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>
firstName
和lastName
是此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"
时,它完全正常。
无法理解其原因,也无法找到解决此问题的方法。或者其他一些方法来实现这一目标。