В чем разница между @NotNull, @NotEmpty и @NotBlank в Hibernate Validator 4.1+?

114

Кажется, я не могу найти краткое изложение, которое бы различало разницу между этими тремя аннотациями.

Рик Хэнлон II
источник

Ответы:

314

@NotNull: Объект CharSequence, Collection, Map или Array не равен нулю , но может быть пустым.
@NotEmpty: Объект CharSequence, Collection, Map или Array не равен нулю и имеет размер> 0 .
@NotBlank: Строка не пуста, а обрезанная длина больше нуля .

Чтобы помочь вам понять, давайте посмотрим, как эти ограничения определяются и выполняются (я использую версию 4.1):

  1. @NotNullОграничение определяется как:

    @Constraint(validatedBy = {NotNullValidator.class})  

    Этот класс имеет isValidметод, определенный как:

    public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
     return object != null;  
    }
    
  2. @NotEmptyОграничение определяется как:

    @NotNull  
    @Size(min = 1)    
    

    Таким образом , это ограничение использует на @NotNullограничение выше, и @Size определение которого отличается на основе объекта , но должно быть само explanitory.

  3. Наконец, @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, если она равна нулю, потому что, как я уже упоминал, @NotEmptyопределение также требует @NotNull.

Вот несколько примеров:

  1. Имя строки = null;
    @NotNull: false
    @NotEmpty: false
    @NotBlank: false

  2. Строка name = "";
    @NotNull: истина
    @NotEmpty : ложь
    @NotBlank: ложь

  3. Строка name = "";
    @NotNull: истина
    @NotEmpty : истина
    @NotBlank : ложь

  4. String name = "Отличный ответ!";
    @NotNull: правда
    @NotEmpty : правда
    @NotBlank : правда

Рик Хэнлон II
источник
29
Я провел некоторое время самостоятельно, отслеживая эту информацию, и хотел помочь другим извлечь пользу из этих усилий. «Чтобы быть предельно ясным, задавать свой вопрос и отвечать на него - это не просто нормально, это явно поощряется». blog.stackoverflow.com/2011/07/…
Rick Hanlon II
4
На мой взгляд, @NotBlank ДОЛЖЕН принимать значение null. В некоторых случаях вы принимаете значение null для необязательных полей, где пустое значение просто недопустимо.
tbraun
1
Я согласен с этим. Если вы хотите не null и не пустой, вы можете использовать оба. Поскольку это не так, вы можете написать свой собственный валидатор и использовать его так, как вы ожидаете.
Рик Хэнлон II,
1
Просто примечание: @NotNull можно использовать с любым объектом, а не только с «CharSequence, Collection, Map или Array»; как действительно показывает код, который вы вставили в пункте 1.
Niccolò
@RickHanlonII Могли бы вы подсказать, как он проходит проверку в Hibernate Validator 5+. Похоже, что ConstraintValidatorс этими аннотациями больше ничего не связано .
Стив
7

Мне понравилось объяснение в приведенной ниже ссылке: http://www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/

@NotNull: проверяет, не является ли значение нулевым, без учета содержимого

@NotEmpty: проверяет, не является ли значение пустым или нулевым. Если в нем есть только пустые места, он разрешит его как непустое.

@NotBlank: проверяет, не является ли значение нулевым или пустым, сначала обрезает значение. Это означает, что он не допускает только пустых пространств.

Итак, если вы хотите проверить, что поле не является нулевым, но также имеет не только пустые пробелы, но и текст, вам следует использовать @NotBlank.

Pratiksha
источник
1
  1. @NotNull: ограниченный CharSequence, Collection, Map или Array действителен, если он не равен NULL, но может быть пустым
  2. @NotEmpty: ограниченный CharSequence, Collection, Map или Array действителен, если он не равен нулю и его размер / длина больше нуля.
  3. @NotBlank: ограниченная строка действительна до тех пор, пока она не равна нулю и обрезанная длина больше нуля.
Мукеш Кумар Гупта
источник