如何为复合组件内的输入组件指定验证器?

Nar*_*ddi 5 jsf composite-component jsf-2

如果我faces-config.xml使用JSF 2.0.4,我应该注册自定义验证器吗?我的自定义验证器使用Validator接口javax.faces.validator.Validator.

<cc:myComp id="customcomp1" ... />

<cc:myComp id="customcomp2" ...>
    <f:validator id="myvalidator" for="myComp" />
</cc:myComp>
Run Code Online (Sandbox Code Playgroud)

myComp.xhtml

<cc:interface>
    <cc:attribute ... />
    <!-- more attributes -->
</cc:interface>
<cc:implementation>
    <h:panelGroup layout="block">
        <h:inputText id="firstName" ... />
        <h:inputText id="middleName" ... />
        <h:inputText id="lastName" ... />
    </h:panelGroup>
</cc:implementation>
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 5

根据更新后的问题中的代码示例,您似乎根本没有将验证器委派给正确的输入,因此完全忽略验证器.

您需要定义所需的输入(您想附加验证)作为<composite:editableValueHolder><composite:interface>.

<cc:interface>
    <cc:editableValueHolder name="forName" targets="inputId" />
    ...
</cc:interface>
<cc:implementation>
    ...
    <h:inputText id="inputId" ... />
    ...
</cc:implementation>
Run Code Online (Sandbox Code Playgroud)

以上<composite:editableValueHolder>基本上告诉任何<f:validator for="forName">必须应用于<h:inputText id="inputId">.那么,以下应该这样做:

<cc:myComp>
    <f:validator id="myValidator" for="forName" />
</cc:myComp>
Run Code Online (Sandbox Code Playgroud)

你甚至可以在name和中使用相同的值targets,但关键点是必须有一个<composite:editableValueHolder>存在,以便JSF知道确切的验证器应该针对哪个输入组件,复合中可以有多个输入组件,你看到.