JSF 2 сообщения в валидаторе - PullRequest
1 голос
/ 17 октября 2011

У меня были сомнения относительно сообщений, устанавливаемых в пользовательском валидаторе в JSF 2.0.вот код

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, как ему удается получить его в пользовательском интерфейсе ???

Ответы [ 2 ]

4 голосов
/ 17 октября 2011

JSF делает это в методе UIInput#validateValue() . Он просто вызывает ваш валидатор внутри блока try-catch, перехватывает ValidatorException, извлекает из него FacesMessage и, наконец, добавляет его к FacesContext идентификатору клиента компонента.

Реализации JSF с открытым исходным кодом. В исходном коде Mojarra 2.1.3 вы можете найти следующее, начиная со строки 1143 класса UIInput:

// 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); 
                }
            }
        }
    }
}
0 голосов
/ 17 октября 2011

jsf имеет исключение catch в ответ и возвращает ваше сообщение ..

Если это не отвечает на ваш вопрос, я не понимаю ваш вопрос ...

возможно этоссылка поможет вам: http://java.dzone.com/articles/jsf-validation-tutorial-error

Вы также должны установить место для ошибок в jsf ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...