Несколько валидаторов в одном поле с валидацией бина JSF - PullRequest
7 голосов
/ 26 сентября 2011

Я пытаюсь сделать несколько проверок одно поле

    @NotBlank(message = "{name.required}")
    @Max(value = 25, message = "{long.value}")
    public String name;

JSF:

<h:inputText id="name" value="#{person.name}" size="20">
</h:inputText>
<h:message for="name" style="color:red" />

, но когда я оставляю поле пустым, отображаются оба сообщения об ошибке.

любые идеи, как обрабатывать оба случая, проверять пустую и максимальную длину независимо.

1 Ответ

5 голосов
/ 26 сентября 2011

Если ваша конфигурация JSF 2 интерпретирует пустые отправленные значения как "", а не null, тогда:

Валидатор @NotBlank возвращает false, потому что ваш аннотированный строка пуста.

Валидатор @Max возвращает false, потому что в соответствии с реализацией hibernate (я полагаю, вы используете базу реализации hibernate на своих предыдущих постах).

public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        //null values are valid
        if ( value == null ) {
            return true;
        }
        try {
            return new BigDecimal( value ).compareTo( BigDecimal.valueOf( maxValue ) ) != 1;
        }
        catch ( NumberFormatException nfe ) {
            return false;
        }
    }

В вашем случае параметр value String содержит пустое значение (""), а конструктор BigDecimal (String) выдает исключение, и затем средство проверки возвращает false.

У вас есть два возможных решения:

...