Кажется, я не могу найти резюме, которое отличает разницу между этими тремя аннотациями.
В Hibernate Validator 4.1+ в чем разница между @NotNull, @NotEmpty и @NotBlank?
Ответ 1
@NotNull
: объект CharSequence, Collection, Map или Array не является нулевым, но может быть пустым. @NotEmpty
: объект CharSequence, Collection, Map или Array не равен null и размеру > 0. @NotBlank
: строка не имеет значения null , а обрезанная длина больше нуля.
Чтобы помочь вам понять, давайте рассмотрим, как эти ограничения определяются и выполняются (я использую версию 4.1):
-
Ограничение
@NotNull
определяется как:@Constraint(validatedBy = {NotNullValidator.class})
Этот класс имеет метод
isValid
, определяемый как:public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) { return object != null; }
-
Ограничение
@NotEmpty
определяется как:@NotNull @Size(min = 1)
Таким образом, это ограничение использует ограничение
@NotNull
выше, и@Size
, чье определение отличается от объекта, но должно быть самообучением. -
Наконец, ограничение
@NotBlank
определяется как:@NotNull @Constraint(validatedBy = {NotBlankValidator.class})
Таким образом, это ограничение также использует ограничение
@NotNull
, но также ограничивает класс NotBlankValidator. Этот класс имеет методisValid
, определяемый как:if ( charSequence == null ) { //curious return true; } return charSequence.toString().trim().length() > 0;
Интересно, что этот метод возвращает true, если строка равна null, но false тогда и только тогда, когда длина обрезанной строки равна 0. Это нормально, что она возвращает true, если она равна null, поскольку, как я уже упоминал, определение
@NotEmpty
также требует@NotNull
.
Вот несколько примеров:
-
Строковое имя = null;
@NotNull
: false
@NotEmpty
: false
@NotBlank
: false -
Строковое имя = "";
@NotNull
: true
@NotEmpty
: false
@NotBlank
: false -
Строковое имя = "";
@NotNull
: true
@NotEmpty
: true
@NotBlank
: false -
Строковое имя = "Отличный ответ!",
@NotNull
: true
@NotEmpty
: true
@NotBlank
: true
Ответ 2
Мне понравилось объяснение в приведенной ниже ссылке: http://www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/
@NotNull: проверяет, не является ли значение нулевым, не учитывая содержимое
@NotEmpty: проверяет, является ли значение не нулевым и не пустым. Если в нем только пустые места, он будет разрешен как не пустой.
@NotBlank: проверяет, является ли значение нулевым или пустым, сначала обрезая значение. Это означает, что он не допускает пустых мест.
Итак, если вы хотите проверить, что поле не пустое, а также что оно не имеет пустых пространств, но содержит текст, вы должны использовать @NotBlank.
Ответ 3
-
@NotNull:
ограниченная последовательность CharSequence, Collection, Map или Array действительна, если она не равна нулю, но может быть пустой -
@NotEmpty:
ограниченная CharSequence, Collection, Map или Array действительна, если она не равна нулю и ее размер/длина больше нуля. -
@NotBlank:
ограниченная строка действительна, если она не равна нулю и усеченная длина больше нуля.