InputText验证器属性由烤豆中的现有字段设置

时间:2019-04-04 22:51:23

标签: validation jsf input

我有一些输入文本,其格式由@Named Bean管理,我想集中有关该字段的信息,例如将哪个验证器分配给哪个字段。

如果我直接输入@FaceValidator的名称,它将起作用。

<h:inputText validator="validatorLogin"/>

如果我尝试使用bean属性(例如String validateatorLogin = validateatorLogin)放置验证器的名称。

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

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

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

我希望在bean中设置验证者名称,并且bean在inputtext字段中提供验证者ID。因此,有关表单的所有信息都集中在一个bean中。

这样做也是愚蠢的,还是会使代码更有条理?

1 个答案:

答案 0 :(得分:1)

validator属性文档中指出,无法通过bean属性为该属性提供ValidatorId:

  

验证器: MethodExpression 表示将被调用的验证器方法   在过程验证期间对值执行正确性检查   该组件的。 表达式必须计算为公共方法   ,它带有FacesContext,UIComponent和Object参数,并带有   返回无效类型。

通常,您可以像在第一个示例中那样对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>