1

我很困惑,因为我的自定义所需验证没有被触发。我有一个类,它以编程方式创建我的 HtmlTextInput 元素并添加验证器。此外,我得到了我的自定义验证器类。控制台告诉我验证器绑定到 HtmlTextInput。无论如何,在点击“保存”后 CustomRequiredValidator 没有被调用!我正在使用 JSF 2.x。提前致谢。

// programmatically built HtmlInput-element
if (freeText.isRequired()) {
    // Validator-Objekt
    System.out.println("CustomRequiredValidator bound.");
    final CustomRequiredValidator validator = (CustomRequiredValidator) FacesContext.getCurrentInstance().getApplication().createValidator("CustomRequiredValidator");
    inputText.addValidator(validator);
}

// CustomValidator
@FacesValidator("CustomRequiredValidator")
public class CustomRequiredValidator implements Validator {
    @Override
    public void validate(FacesContext context, UIComponent uiComponent, Object value) throws ValidatorException {
        System.out.println("RequiredValidator.validate ..."); ...
    }
}
4

1 回答 1

0

仅当转换成功时才调用验证器。因此,如果有一个转换器,无论是显式注册还是隐式使用(例如,拥有一个Integerbean 属性会触发 JSF 内置IntegerConverter)并且它抛出了一个ConverterException,那么验证器将永远不会被触发。但是,您应该在任何相关<h:message(s)>组件或服务器日志中注意到此转换器异常。

如果转换器被排除在怀疑之外,那么另一个可能的原因是 JSF 被配置为不通过在 webapp 中具有以下上下文参数来验证空字段web.xml

<context-param>
    <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
    <param-value>false</param-value>
</context-param>

除此之外,运行调试器,从UIInput#validate()方法处的断点开始应该可以提供见解。

于 2013-04-05T12:55:42.163 回答