我很困惑,因为我自定义所需的验证没有被触发。我有一个类,创建我的HtmlTextInput元素编程和添加验证器。此外,我还得到了自定义验证器类。控制台告诉我validators被绑定到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 ..."); ...
}
}
只有在转换成功时才调用验证器。因此,如果存在显式注册或隐式使用的转换器(例如,拥有Integer
bean属性将触发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()
方法的断点开始,应该会给你一些启示。