JSR303 ConstraintValidator, как показать сообщение без страницы ошибки - PullRequest
0 голосов
/ 18 февраля 2011

Я работаю с JSF 2.0 и Glassfish v3. Я тестировал функциональность проверки bean-компонента JSR303, поэтому я создал валидатор, который реализует ConstraintValidator, а затем аннотировал это свойство, которое я хочу проверить.

Работает нормально, но отображает страницу ошибки Glassfish по умолчанию. Я не хочу, чтобы это отображалось, я бы предпочел, чтобы сообщение отображалось в <h:outputText> или что-то еще.

Кто-нибудь знает, как этого добиться?

Вот мой метод проверки:

@Override
public boolean isValid(String searchArg, ConstraintValidatorContext ctx) {

    boolean searchArgCorrect = true;
    FacesMessage msg;
    if(searchArg!=null) {
        ctx.disableDefaultConstraintViolation();
        if(searchArg.length() < 3) {
            ctx.buildConstraintViolationWithTemplate("Searcharg is too short").addConstraintViolation();
            searchArgCorrect=false;

            msg = new FacesMessage(
                    FacesMessage.SEVERITY_ERROR,
                    "Searcharg is too short", null);

            throw new  ValidatorException(msg);
        }
    }

    return searchArgCorrect;
}

PS: я знаю, что существуют более простые способы проверки длины строки, но приведенный выше фрагмент кода предназначен только для демонстрации / тестирования. У меня есть другие планы с валидатором.

1 Ответ

6 голосов
/ 18 февраля 2011

Вы смешиваете две концепции: валидация JSF и валидация JSR 303.Вы реализуете проверку bean-компонента JSR303, но выдает специфичный для JSF ValidatorException.

Метод не должен вызывать исключение.Метод должен просто возвращать true или false в зависимости от результата проверки.Сообщение должно быть определено в ValidationMessages.properties.JSF отобразит его в виде <h:message>, который связан с компонентом ввода.

См. Также эту документацию о создании пользовательских ограничений с помощью сообщения.


Или, если вы на самом деле после стандартного валидатора JSF, тогда вы должны реализовать javax.faces.validator.Validator, аннотировать его с помощью @FacesValidator и объявить его в виде <f:validator>.Может выдать ValidatorException, и сообщение будет отображаться в <h:message>, связанном с компонентом ввода.

...