我有一些输入文本,其格式由@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中。
这样做也是愚蠢的,还是会使代码更有条理?
答案 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>