如何在JSF中执行验证,如何在JSF中创建自定义验证器

时间:2011-05-18 16:21:08

标签: validation jsf jsf-2 javabeans

我想使用一些Java bean方法在我的一些输入组件中执行验证,例如<h:inputText>。我应该使用<f:validator><f:validateBean>吗?我在哪里可以阅读更多相关信息?

1 个答案:

答案 0 :(得分:16)

您只需要实现Validator界面。

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

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

        if (valueIsInvalid) {
            throw new ValidatorException(new FacesMessage("Value is invalid!"));
        }
    }

}

@FacesValidator会将其注册到带有验证程序标识myValidator的JSF,以便您可以在任何validator / <h:inputXxx>组件的<h:selectXxx>属性中引用它如下:

<h:inputText id="foo" value="#{bean.foo}" validator="myValidator" />
<h:message for="foo" />

您也可以使用<f:validator>,如果您打算在同一个组件上附加多个验证器,这将是唯一的方法:

<h:inputText id="foo" value="#{bean.foo}">
    <f:validator validatorId="myValidator" />
</h:inputText>
<h:message for="foo" />

每当验证器抛出ValidatorException时,其消息将显示在与输入字段关联的<h:message>中。

您可以使用<f:validator binding>在EL范围内的某处引用具体的验证器实例,而这可以很容易地作为lambda提供:

<h:inputText id="foo" value="#{bean.foo}">
    <f:validator binding="#{bean.validator}" />
</h:inputText>
<h:message for="foo" />

public Validator getValidator() {
    return (context, component, value) -> {
        // ...

        if (valueIsInvalid) {
            throw new ValidatorException(new FacesMessage("Value is invalid!"));
        }
    };
}

为了更进一步,您可以使用JSR303 bean验证。这将根据注释验证字段。由于这将是一个完整的故事,这里只是一些入门链接:

<f:validateBean>仅在您打算禁用 JSR303 bean验证时才有用。然后,您将输入组件(甚至整个表单)放在<f:validateBean disabled="true">

另见: