我正在编写一个复合组件,其中包含一个 <h:selectManyMenu>
,我想允许这个组件的客户通过将 <f:validator>
和 <f:converter>
标记放置在我的复合组件标签的子元素中来提供验证器和转换器。在我的组合接口部分中,我有:
<composite:editableValueHolder name="select-input" targets="select-many" />
并且在实现部分:
<h:selectManyMenu id="select-many" styleClass="hidden select-input" value="#{cc.attrs['value']}" binding="#{cc.inputComponent}">
<composite:insertChildren />
</h:selectManyMenu>
最后是用法:
<cwi:selectManyMenu id="select-many-menu" value="#{selectManyBean.selectedItems}">
<f:converter converterId="converter.testItem" for="select-many" />
<f:validator validatorId="validator.testItem" for="select-input" />
<f:selectItems value="#{selectManyBean.possibleItems}" var="item" itemValue="#{item}" itemLabel="#{item.description}" />
</cwi:selectManyMenu>
问题在于验证器和转换器都没有被调用。我有验证器和转换器类,分别用
@FacesValidator('validator.testItem')
和@FacesConverter("converter.testItem")
进行注释。它们被正确地拾取了,因为如果我将<f:validator>
和<f:converter>
标签移到组合组件内,在<composite:insertChildren>
下面,一切正常运作,但我更愿意将这些暴露给客户端而不是硬编码它们。当使用editableValueHolder时,insertChildren的工作方式是否有问题?为了使其工作,我可以将转换器和验证器ID作为接口的一部分,但这会失去向转换器和验证器传递属性的某些灵活性。