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

时间:2012-01-08 19:52:27

标签: jsf jsf-2 composite-component

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

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

<cc:myComp id="customcomp2" ...>
    <f:validator id="myvalidator" for="myComp" />
</cc:myComp>

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>

3 个答案:

答案 0 :(得分:5)

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

您需要在<composite:interface>中将{02}定义为所需的输入(您要为其附加验证码)。

<cc:interface>
    <cc:editableValueHolder name="forName" targets="inputId" />
    ...
</cc:interface>
<cc:implementation>
    ...
    <h:inputText id="inputId" ... />
    ...
</cc:implementation>

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

<cc:myComp>
    <f:validator id="myValidator" for="forName" />
</cc:myComp>

您甚至可以在nametargets中使用相同的值,但关键点是必须存在<composite:editableValueHolder>,以便JSF知道哪个输入组件与验证器完全相同应该是目标,复合中可以有多个输入组件,你看。

答案 1 :(得分:3)

如果您正在使用JSF 2,我认为您不需要触摸faces-config.xml文件来创建客户Validator。您只需使用注释@FacesValidator即可声明Validator。它应该是这样的:

@FacesValidator("myValidator")
public class MyValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        // Your logic
    }

}

然后您可以在.xhtml页面中开始使用它,例如<f:validator>标记:

<f:validator validatorId="myValidator" />

答案 2 :(得分:1)

没有。 Jsf 2.0没有必要这样做。只需使用@FacesValidator为您的验证者添加注释即可。注释会自动注册验证器。不需要xml。