В 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

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