Validation 未触发CustomRequiredvalidator

Validation 未触发CustomRequiredvalidator,validation,jsf,Validation,Jsf,我感到困惑,因为我的自定义所需验证没有被触发。 我得到了一个类,它以编程方式创建我的HtmlTextInput元素并添加 验证器。此外,我还获得了自定义验证器类。控制台告诉我 验证程序已绑定到HtmlTextInput。不管怎样,在点击“保存”之后 未调用CustomRequiredValidator!我正在使用JSF2.x。谢谢你 前进 // programmatically built HtmlInput-element if (freeText.isRequired()) { //

我感到困惑,因为我的自定义所需验证没有被触发。 我得到了一个类,它以编程方式创建我的HtmlTextInput元素并添加 验证器。此外,我还获得了自定义验证器类。控制台告诉我 验证程序已绑定到HtmlTextInput。不管怎样,在点击“保存”之后 未调用CustomRequiredValidator!我正在使用JSF2.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
,那么验证器将永远不会被触发。但是,您应该在任何相关的
组件或服务器日志中注意到此转换器异常

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

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

javax.faces.VALIDATE_空_字段
假的

除此之外,运行一个调试器,从方法的断点开始,应该可以提供一些见解。

真的很奇怪:例如,如果我让字段为空,或者在其中键入一个空格,则不会调用-validate()。如果我在字段中键入类似“1234”的值,将调用validate()?!请注意,对
CustomRequiredValidator
的强制转换完全破坏了抽象(即
应用程序#createValidator()
方法完全没有意义,您也可以在此处使用
新的CustomRequiredValidator()
)。摆脱强制转换,只需将其声明为
验证程序
。在my web.xml中,没有javax.faces.VALIDATE\u空字段这样的条目。在我的控制台中,我无法看到ConverterException被抛出。我必须找出如何调试ProcessValidation阶段。目前,我认为如果我的System.out.println没有到达,也不会到达断点。题外话:谢谢巴卢斯克,我认为你们在这里努力支持人们真是太好了!呃,我指出了设置断点的确切类/方法:
UIInput#validate()
。你试过了吗?我没有说要在自定义验证器上设置断点。该死,我无法在UIInput类中设置断点。我这里只有班级档案。我将尝试完成它,Eclipse为我提供了一个攻击某些源代码的选项。我会尽力解决这个问题。莫哈拉的资料可在。只需下载源ZIP文件并在Eclipse的“附加源代码”中精确地指向该文件。我希望你已经做到了。。。没有源代码的调试并不好笑:)请确保下载的JSF源代码版本与实际使用的JSF二进制文件完全相同。我想我需要Apache MyFaces,不幸的是我需要版本2.0.7,我只能找到2.0.18,请参阅。似乎我遇到了一个问题,我想下次我会尝试在我的机器上的某个地方存储所有相关的源代码。