Проверка JSF / Hibernate NotBlank - PullRequest
0 голосов
/ 16 июля 2010

У меня есть простая форма JSF + RichFaces с некоторыми полями и, очевидно, вспомогательным компонентом для их хранения. В этом бине все необходимые свойства имеют аннотации проверки (jsr303 / hibernate), но я не могу найти аннотацию, которая бы проверяла, является ли свойство (String) пустым. Я знаю, что есть аннотация @NotBlank в весенних модулях, но JSF не поддерживает весеннюю проверку. Есть ли какой-нибудь простой способ проверить это или я должен написать свою собственную аннотацию?

@ Редактировать: я уже пробовал @NotNull и @NotEmpty из jsr303 и hibernate, но они оба потерпели неудачу, я все еще могу отправить пустую строку вроде "".

Ответы [ 3 ]

9 голосов
/ 16 июля 2010

Если вы используете Hibernate Validator 4.1 в качестве реализации JSR-303, они предоставляют аннотацию @ NotBlank , которая ТОЧНО выполняет то, что вы ищете, отдельно от @NotNull и @NotEmpty. Вы должны использовать (в настоящее время) последнюю версию, но это будет работать.

Если по какой-то причине вы не можете перейти на последнюю версию, вам не составит труда написать аннотацию самостоятельно.

1 голос
/ 16 июня 2013

Hibernate Validator 4.1+ предоставляет пользовательскую аннотацию только для строк @NotBlank, которая проверяет наличие ненулевых и не пустых после обрезки пробелов . API для @NotBlank состояний:

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

Если неясно, что @NotEmpty обрезает строку перед проверкой, сначала посмотрите описание, приведенное в документе 4.1 под таблицей 'встроенные согласования' :

Убедитесь, что аннотированная строка не равна нулю, а усеченная длина больше 0. Отличие от @NotEmpty заключается в том, что это ограничение может применяться только к строкам, а конечные пробелы игнорируются.

Затем просмотрите код, и вы увидите, что @NotBlank - это , определенное как :

@Documented
@Constraint(validatedBy=NotBlankValidator.class)
@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})
@Retention(value=RUNTIME)
@NotNull
public @interface NotBlank{
  /* ommited */
}

В этом определении следует отметить две вещи. Во-первых, определение @NotBlank включает @NotNull, поэтому это расширение @NotNull. Второе - это расширение @NotNull с использованием @Constraint с NotBlankValidator.class. Этот класс имеет метод isValid, который:

public boolean isValid(CharSequence charSequence, ConstraintValidatorContext constraintValidatorContext) {
  if ( charSequence == null ) { //this is curious
    return true;
  }
    return charSequence.toString().trim().length() > 0; //dat trim
}

Интересно, что этот метод возвращает true, если строка равна нулю, но false, если и только если длина обрезанной строки равна 0. Это нормально, что он возвращает true, если он равен нулю, поскольку, как я уже говорил, определение @NotEmpty требует @ NotNull.

0 голосов
/ 16 июля 2010

Возможно @NotEmpty?

Что определяется как:

@NotNull
@Size(min=1)

Поскольку вы используете richfaces, я думаю, вы используете <rich:beanValidator />?Он обрабатывает аннотации JSR 303.

Обновление : Попробуйте (взято из здесь ):

@Pattern(regex="(?!^[\s]*$)"). 
...