我有一个由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中。
这样做是否愚蠢或是否会使代码更有条理?
正如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>