如何从JSF2复合组件将validator属性传递给h:inputText?

如何从JSF2复合组件将validator属性传递给h:inputText?,jsf,jsf-2,validation,composite-component,Jsf,Jsf 2,Validation,Composite Component,我们创建了一个文本输入组件作为JSF2组件,它封装了标签和编辑字段(h:inputText),并且还负责布局。 我们目前的问题是获取要在复合组件上公开的inputField的validator属性。我们在cc:interface部分声明了该属性,但在cc:implementation中声明内部h:inputText时添加validator=“#{validator}”的问题是,如果不使用该字段,则在运行时会失败 我想用与h:inputText相同的方法来实现这一点,而不必注册自定义验证器 对于这

我们创建了一个文本输入组件作为JSF2组件,它封装了标签和编辑字段(
h:inputText
),并且还负责布局。 我们目前的问题是获取要在复合组件上公开的inputField的validator属性。我们在cc:interface部分声明了该属性,但在cc:implementation中声明内部h:inputText时添加
validator=“#{validator}”
的问题是,如果不使用该字段,则在运行时会失败

我想用与h:inputText相同的方法来实现这一点,而不必注册自定义验证器

对于这类问题有什么已知的解决方案吗?我们试图创建一个自定义标记,用于复合组件内部,但它过于复杂,最终无法工作,因此我向专家询问是否有一种简单的方法可以做到这一点

注意:我想在复合组件的validator属性中使用一个方法绑定表达式,就像h:inputText的原始表达式一样。
谢谢你的帮助

我有一些带有特定掩码、验证和转换器的组件

首先,我定义了一个名为“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?在这里,您可以定义要链接conversor/validator的组件

因此,我使用我的“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>

定义任何验证器/转换器(
)都将与
关联

然后我在页面上使用文本组件:

<foo:text value="#{dummyMBean.text}" mask="99.999-99" jsfConverter="..." jsfValidator="..."/>

我有一些带有特定掩码、验证和转换器的组件

首先,我定义了一个名为“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?在这里,您可以定义要链接conversor/validator的组件

因此,我使用我的“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>

定义任何验证器/转换器(
)都将与
关联

然后我在页面上使用文本组件:

<foo:text value="#{dummyMBean.text}" mask="99.999-99" jsfConverter="..." jsfValidator="..."/>