Jsf 2 JSF 2.2复合组件EditableValueHolder

Jsf 2 JSF 2.2复合组件EditableValueHolder,jsf-2,composite-component,Jsf 2,Composite Component,我正在编写一个包含的复合组件,我希望通过将和标记作为我的复合组件标记的子项来允许该组件的客户端提供验证器和转换器。在复合材料的界面部分,我有 <composite:editableValueHolder name="select-input" targets="select-many" /> 在执行部分: <h:selectManyMenu id="select-many" styleClass="hidden select-input" value="#{cc.attr

我正在编写一个包含
的复合组件,我希望通过将
标记作为我的复合组件标记的子项来允许该组件的客户端提供验证器和转换器。在复合材料的界面部分,我有

<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>


问题是验证程序和转换器都没有被调用。我还有validator和converter类,每个类分别用
@FacesValidator('validator.testItem')
@facescoverter(“converter.testItem”)
注释。它们被正确地拾取,因为如果我在复合组件中移动
标记,在
下面,一切正常,但我宁愿将它们公开给客户端,而不是硬编码它们。当使用editableValueHolder时,insertChildren的工作方式是否有一些问题?为了实现这一点,我可以将转换器和验证器ID作为接口的一部分,但这样就失去了将属性传递给转换器和验证器的灵活性。

我使用的是Mojarra 2.2.8-jbossorg-1。除了现在明显的打字错误之外,我还应该包括更多的复合组件的xhtml。我使用了一个支持组件,没有支持组件,一旦我修复了输入错误,一切都正常,但是当我添加支持组件时,验证程序和转换器停止工作


在查看了复合组件的wiki页面后,我意识到复合组件的支持组件与自定义组件的类不同。对于复合组件,它们应该始终只是扩展UINamingContainer。我的错误,特别是对于这个selectManyMenu,是我的支持组件扩展了UISelectMany。

哪个JSF impl/版本?在我将
中的“明显”输入错误修复为您在
中已经正确获得的值后,它在Mojarra 2.2.12上对我来说运行良好。您可以扩展
UISelectMany
并实现
NamingContainer
并重写
getFamily()
以返回
UINamingContainer.COMPONENT\u FAMILY