如何将验证器属性传递给JSF2复合组件中的h:inputText?

时间:2012-02-24 17:22:10

标签: jsf jsf-2 validation composite-component

我们创建了一个文本输入组件作为JSF 2组件,它封装了标签和编辑字段(h:inputText),并且还负责布局。 我们目前的问题是让inputField的validator属性暴露在我们的复合组件上。我们在cc:interface部分声明了属性,但在cc:实现中声明内部h:inputText时添加validator="#{validator}"的问题是,当未使用该字段时,它在运行时失败。

我想以与h:inputText相同的方式执行此操作,而无需注册自定义验证器。

对于这类问题,是否有一些已知的解决方案?我们尝试创建一个在复合组件中使用的自定义标签,但它过于复杂而且最终没有用,所以我想向专家询问是否有一种简单的方法可以做到这一点。

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

1 个答案:

答案 0 :(得分:0)

我有一些具有特定掩码,验证和转换器的组件。

首先,我定义了一个名为'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="..."/>