Validation bakedbean中现有字段设置的Inputtext验证程序属性

Validation bakedbean中现有字段设置的Inputtext验证程序属性,validation,jsf,input,Validation,Jsf,Input,我有一些表单中的inputtext,它由一个名为的bean@管理,我想集中关于这个字段的信息,比如哪个验证器被分配到哪个字段 如果我直接写@FaceValidator的名称,它就会工作 <h:inputText validator="validatorLogin"/> 如果我尝试将验证器的名称与bean属性(如stringvalidatorlogin=validatorLogin)放在一起 它将在类似.xhtml的表达式中引发错误。该表达式必须是方法表达式,但却是值表达式 如果我仍

我有一些表单中的inputtext,它由一个名为的bean@管理,我想集中关于这个字段的信息,比如哪个验证器被分配到哪个字段

如果我直接写@FaceValidator的名称,它就会工作

<h:inputText validator="validatorLogin"/>
如果我尝试将验证器的名称与bean属性(如stringvalidatorlogin=validatorLogin)放在一起

它将在类似.xhtml的表达式中引发错误。该表达式必须是方法表达式,但却是值表达式

如果我仍然尝试运行代码,它将抛出以下异常验证器={bean.validatorLogin}:methodnotfound

<h:inputText validator="#{bean.validatorLogin}"/>
我希望在bean中设置验证器名称,bean在inputtext字段中提供验证器id。因此,关于表单的所有信息都集中在一个bean中

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

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

validator:MethodExpression,表示将调用的验证程序方法 在流程验证期间,对值执行正确性检查 这个组成部分的一部分。表达式必须计算为公共方法 它接受FacesContext、UIComponent和对象参数,并带有 返回void的类型

通常,您要么像在第一个示例中那样硬编码validatorId,要么像在第二个示例中硬编码解析为如下方法的方法表达式:

public void validatorLogin(FacesContext context, UIComponent component, Object value)
        throws ValidatorException {
    // ...
}
当然,如何验证输入取决于这个bean实现。如果要结合使用这两种方法,可以将验证委托给validatorLogin方法中ID已知的一个或多个验证器:


你为什么要这样做?您是否有条件地切换验证程序?如果没有,只需将validatorId硬编码到validator属性中即可。我认为关于如何在页面上进行验证的信息应该包含在ManagedBean中。所以我们只检查bean以了解有关逻辑的信息,首页只包含设计。谢谢您的回答。我试图做的是从硬编码的id。我希望这个硬编码字符串作为字段存在于外部类中。所以我可以这样用。基本上,我希望验证程序的硬编码id位于外部类中的某个位置,并使用该类检索id名称。但当我尝试时,它将抛出错误,例如它将在.xhtml vlalidation类表达式中抛出错误。该表达式必须是方法表达式,但却是值表达式。如果我绕过xhtml验证错误并尝试继续运行代码,它将抛出以下异常验证器={bean.validatorLogin}:Method not found。您可以实现我的方法determineValidatorIds以返回{bean.fields.ValidatoridForInputExt}的结果。您不能使用validator={bean.fields.validatorIdForInputText},因为需要一个方法表达式。谢谢,是的,我认为您的实现可以暂时使用。从长远来看,最好使用bean的属性来返回id,而不是使用方法。@fra我已经更新了答案,并添加了f:validator标记作为替代。
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.
}
<h:inputText id="txt" value="#{myBean.textValue}">
    <f:validator validatorId="#{myBean.arbitraryValidatorId}" />
</h:inputText>