У меня было несколько компонентов с определенными масками, валидациями и конвертерами.
Сначала я определил компонент с именем defaultText следующим образом:
</cc:interface>
<cc:attribute name="value"/>
<cc:editableValueHolder name="mycomp" targets="input"/>
</cc:interface>
<cc:implementation>
<p:inputMask id="input" value="#{cc.attrs.value}"/>
</cc:implementation>
(есть некоторые другие атрибуты, которые я выпускаю для экономии места). Смотрите editableValueHandler? Здесь вы определяете, к какому компоненту вы будете привязывать собеседника / валидатора.
Итак, я использовал свой компонент defaultText для создания других компонентов, например, text.xhtml:
</cc:interface>
<cc:attribute name="value"/>
<cc:attribute name="mask"/>
<cc:attribute name="jsfConverter"/>
<cc:attribute name="jsfValidator"/>
</cc:interface>
<cc:implementation>
<foo:defaultText id="dt" value="#{cc.attrs.value}" mask="#{cc.attrs.mask}">
<c:if test="#{!empty cc.attrs.jsfConverter}">
<f:converter converterId="#{cc.attrs.jsfConverter}" for="mycomp"/>
</c:if>
<c:if test="#{!empty cc.attrs.jsfValidator}">
<f:validator validatorId="#{cc.attrs.jsfValidator}" for="mycomp"/>
</c:if>
</foo:defaultText>
</cc:implementation>
<composite:editableValueHolder>
определяет, что любой валидатор / преобразователь (<f:validator for="mycomp">
) будет связан с <p:inputMask id="input">
.
Затем я использую свой текстовый компонент на своих страницах:
<foo:text value="#{dummyMBean.text}" mask="99.999-99" jsfConverter="..." jsfValidator="..."/>