Несколько валидаторов в одном поле с проверкой JSF bean-компонента

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

    @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" />

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

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


person Mahmoud Saleh    schedule 26.09.2011    source источник
comment
это странно, я не знаю почему, но когда я использовал @Size и выставил максимальное значение, все работает, как ожидалось, есть идеи?   -  person Mahmoud Saleh    schedule 26.09.2011
comment
@Size и @Max не одно и то же. @Size проверяет длину входного строкового значения. @Max проверяет числовое значение любого числового входного значения. Например. 26 не пройдут @Max(25).   -  person BalusC    schedule 26.09.2011


Ответы (1)


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

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

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

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.

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

person Victor Martinez    schedule 26.09.2011
comment
Хорошо поймал! В этом случае OP также может просто использовать @NotNull вместо специфичного для hibernate-impl @NotBlank. - person BalusC; 26.09.2011