Кажется, я не могу найти резюме, которое отличает разницу между этими тремя аннотациями.
В 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:ограниченная строка действительна, если она не равна нулю и усеченная длина больше нуля.