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.