JSF 2.2复合组件EditableValueHolder

3

我正在编写一个复合组件,其中包含一个 <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作为接口的一部分,但这会失去向转换器和验证器传递属性的某些灵活性。

哪个JSF实现/版本?在我将<f:converter for>中的“明显”的拼写错误更正为您已经在<f:validator for>中正确设置的值后,它在Mojarra 2.2.12上对我来说完全正常工作。 - BalusC
1个回答

3

我正在使用Mojarra 2.2.8-jbossorg-1。除了现在明显的拼写错误外,我还应该包括更多我的组合组件的xhtml。我使用了支持组件,没有支持组件时,一旦我纠正了拼写错误,一切都能正常工作,但是当我添加支持组件后,验证器和转换器停止工作。

在查看这里的组合组件wiki页面https://stackoverflow.com/tags/composite-component/info后,我意识到组合组件的支持组件与自定义组件的类不同。对于组合组件,它们应始终扩展UINamingContainer。我的错误,特别是对于这个selectManyMenu,是我的支持组件扩展了UISelectMany。


1
您可以扩展 UISelectMany 并实现 NamingContainer,然后重写 getFamily() 方法并返回 UINamingContainer.COMPONENT_FAMILY - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接