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


Я не могу найти резюме, которое отличает разницу между этими тремя аннотациями.

2 95

2 ответа:

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

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

  1. The @NotNull ограничение определено как:

    @Constraint(validatedBy = {NotNullValidator.class})  
    

    этот класс имеет isValid метод определен как:

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

    @NotNull  
    @Size(min = 1)    
    

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

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

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

  1. String name = null;
    @NotNull: false
    @NotEmpty: нет
    @NotBlank: false

  2. String name = "";
    @NotNull:правда
    @NotEmpty: нет
    @NotBlank: false

  3. String name = " ";
    @NotNull: правда
    @NotEmpty:правда
    @NotBlank: false

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

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

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

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

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

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