由烘焙Bean中的现有字段设置的输入文本验证器属性

问题描述 投票:0回答:1

我有一个由bean @Named管理的表单中的一些inputtext,我想集中关于这个字段的信息,例如哪个验证器分配给哪个字段。

如果我直接写@FaceValidator的名称,它的工作原理。

<h:inputText validator="validatorLogin"/>

如果我试图将验证器的名称与bean属性(如String validatorLogin = validatorLogin)放在一起。

它将在.xhtml中抛出错误,例如“表达式必须是方法表达式,但它是值表达式”。

如果我尝试仍然运行代码,它将抛出以下异常“validator =#{bean.validatorLogin}:找不到方法”。

<h:inputText validator="#{bean.validatorLogin}"/>

我希望在bean和bean中设置验证器名称,以便在inputtext字段中提供验证器id。所以关于表单的所有信息都集中在一个bean中。

这样做是否愚蠢或是否会使代码更有条理?

validation jsf input
1个回答
1
投票

正如validator属性文档所述,无法通过bean属性向此属性提供validatorId:

validator:MethodExpression,表示将在Process Validations期间调用的验证程序方法,以对此组件的值执行正确性检查。表达式必须求值为采用FacesContext,UIComponent和Object参数的公共方法,返回类型为void。

你通常要像你在第一个例子中那样对validatorId进行硬编码,要么在method expression(在你的第二个例子中)解析为这样的方法:

public void validatorLogin(FacesContext context, UIComponent component, Object value)
        throws ValidatorException {
    // ...
}

当然,这个bean实现如何验证输入。如果要组合这两种方法,可以将验证委托给validatorLogin方法中ID所知的一个(或多个)验证器:

public void validatorLogin(FacesContext context, UIComponent component, Object value)
        throws ValidatorException {
    final Collection<String> validatorIds = determineValidatorIds(context, component);
    for (String validatorId : validatorIds) {
        Validator<Object> validator = context.getApplication().createValidator(validatorId);
        validator.validate(context, component, value);
    }
}

private Collection<String> determineValidatorIds(FacesContext context, UIComponent component) {
    // return hard coded validatorIDs or determine them on arbitrary logic.
}

如果您迫切需要通过bean属性提供validatorId,可以在输入组件中使用f:validator标记:

<h:inputText id="txt" value="#{myBean.textValue}">
    <f:validator validatorId="#{myBean.arbitraryValidatorId}" />
</h:inputText>
© www.soinside.com 2019 - 2024. All rights reserved.