我已经设置了一个自定义验证器以在复合组件的元素上运行。它看起来像这样:
<myproject:myComponent>
<f:validator validatorId="customValidator" for="validatedField" />
</myproject:myComponent>
复合组件如下所示:
<composite:interface>
<composite:editableValueHolder name="validatedField" targets="validatedField" />
</composite:interface>
<composite:implementation>
<h:inputText id="validatedField" />
</composite:implementation>
它大部分都在工作,但有一个小问题:我如何根据需要指定一个字段?
看来,当我将已验证字段完全留空时,根本不会调用自定义验证器。我尝试在<f:validateRequired for="validatedField" />
内部添加一个mycomponent
,但它没有用。
编辑(响应 BalusC):对我的复合组件出现的上下文的更详细描述:
<p:outputPanel id="pnlElements">
<ui:repeat value="#{backingViewBean.elementDtos}" var="elementDto">
<p:commandButton value="Edit..."
action="#{backingControllerBean.refreshView}"
ajax="true"
update=":frmMain:editElement"
oncomplete="wdgEditElement.show()">
<f:setPropertyActionListener
target="#higherLevelControllerBean.currentElementId}"
value="#{elementDto.Id}" />
</p:commandButton>
</ui:repeat>
</p:outputPanel>
<p:dialog widgetVar="wdgEditElement" modal="true">
<p:outputPanel id="editElement">
<myproject:myComponent>
<f:validator validatorId="customValidator" for="validatedField" />
</myproject:myComponent>
</p:outputPanel>
</p:dialog>
该页面显示了我创建的元素的列表,每个元素都有一个编辑按钮(以及我省略的其他内容)。单击编辑按钮,会弹出一个窗口,其中包含复合组件(以及保存按钮,为清楚起见再次省略),我可以在其中编辑元素。
问题是,当我设置javax.faces.VALIDATE_EMPTY_FIELDS
为时true
,验证器会在填充编辑窗口的数据对象被设置之前被调用,它会因为我有空字段而对我咆哮。(并且在设置数据对象之前中止执行,因此所有字段都显示为空。)
(此外,我注意到当 whenVALIDATE_EMPTY_FIELDS
设置为时false
,我第二次和随后的点击 Edit 按钮也会触发对验证器的调用。这看起来无害,但不是我所期望的行为。)
我在 Glassfish 下运行,所以我希望<f:validateRequired>
能正常工作——所以也许我用错了。我是这样使用它的:
<myproject:myComponent>
<f:validator validatorId="customValidator" for="validatedField" />
<f:validateRequired for="validatedField" />
</myproject:myComponent>
我做错了吗?