java - validator 中的 JSF 2 消息

标签 java jsf

我对在 JSF 2.0 中自定义 validator 中设置的消息有疑问。 这是代码

public void validate(FacesContext context, UIComponent component,
        Object value) throws ValidatorException {

    matcher = pattern.matcher(value.toString());
    if(!matcher.matches()){

        FacesMessage msg = 
            new FacesMessage("E-mail validation failed.", 
                    "Invalid E-mail format.");
        msg.setSeverity(FacesMessage.SEVERITY_ERROR);
        throw new ValidatorException(msg);

    }

}

现在我很好奇它实际上是如何工作的,因为我们还没有编写代码的一部分 context.add(msg)

如果不在 FacesContext 中添加这些消息,它如何设法在 UI 上检索它???

最佳答案

JSF 在 the UIInput#validateValue() method 中做到了这一点.它只是在 try-catch block 中调用您的 validator ,捕获 ValidatorException,从中提取 FacesMessage,最后将其添加到 FacesContext 在组件的客户端 ID 上。

JSF 实现是开源的。在 Mojarra 2.1.3您可以从 UIInput 类的第 1143 行开始找到以下源代码:

// If our value is valid and not empty or empty w/ validate empty fields enabled, call all validators
if (isValid() && (!isEmpty(newValue) || validateEmptyFields(context))) {
    if (validators != null) {
        Validator[] validators = this.validators.asArray(Validator.class);
        for (Validator validator : validators) {
            try {
                validator.validate(context, this, newValue);
            }
            catch (ValidatorException ve) {
                // If the validator throws an exception, we're
                // invalid, and we need to add a message
                setValid(false);
                FacesMessage message;
                String validatorMessageString = getValidatorMessage();

                if (null != validatorMessageString) {
                    message =
                          new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                           validatorMessageString,
                                           validatorMessageString);
                    message.setSeverity(FacesMessage.SEVERITY_ERROR);
                } else {
                    Collection<FacesMessage> messages = ve.getFacesMessages();
                    if (null != messages) {
                        message = null;
                        String cid = getClientId(context);
                        for (FacesMessage m : messages) {
/* Here --> */              context.addMessage(cid, m);
                        }
                    } else {
                        message = ve.getFacesMessage();
                    }
                }
                if (message != null) {
/* And here --> */  context.addMessage(getClientId(context), message); 
                }
            }
        }
    }
}

关于java - validator 中的 JSF 2 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7790160/

相关文章:

jsf - 发送 f :param when a ValueChangeListener is invoked

java - JSF 应用程序中 CPU 使用率极高

java web 应用程序及其托管服务器

java - 在 Java 中加密和解密 List<String>

java - Apache BeamGenerateSequence 不会以指定的速率发出元素

java - 如何将问题/答案对转移到 playframework 中的 View 类中?

java - 在 richfaces 中使用自定义 skin.properties 文件时无法找到 skinning.css 和 packed.css

java - 可以在主要 Java 代码上放置测试替身实现吗

java - 在Java中得到负数?

jsf - 找不到属性类的 Setter