У сплячому режимі Validator 4.1+, яка різниця між @NotNull, @NotEmpty та @NotBlank?


Відповіді:


314

@NotNull: Об'єкт CharSequence, Collection, Map або масив не є нульовим , але може бути порожнім.
@NotEmpty: Об'єкт CharSequence, Collection, Map або масив не має нульового розміру> 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, якщо рядок є нульовим, але false, якщо і лише тоді, коли довжина обрізаної рядка дорівнює 0. Це нормально, що він повертає true, якщо він є нульовим, оскільки, як я вже згадував, це @NotEmptyвизначення також вимагає @NotNull.

Ось кілька прикладів:

  1. Назва рядка = null;
    @NotNull: false
    @NotEmpty: false
    @NotBlank: false

  2. Ім'я рядка = "";
    @NotNull: true
    @NotEmpty : false
    @NotBlank: false

  3. Ім'я рядка = "";
    @NotNull: true
    @NotEmpty : true
    @NotBlank : false

  4. Рядок name = "Чудова відповідь!";
    @NotNull: true
    @NotEmpty : true
    @NotBlank : true


29
Я витратив деякий час на відстеження цієї інформації самостійно, і хотів допомогти іншим отримати користь від цих зусиль. "Щоб бути кришталево чистим, не просто гаразд задавати і відповідати на власне питання, це прямо рекомендується". blog.stackoverflow.com/2011/07/…
Rick Hanlon II

4
На мою думку, @NotBlank ДОЛЖЕН би прийняти null. Є деякі випадки, коли ви приймаєте null для необов'язкових полів, де порожній просто недійсний.
tbraun

1
Я з цим погодився. Якщо ви хочете не нульовий і не порожній, ви можете використовувати обидва. Оскільки це не так, ви можете написати власний валідатор і використовувати його так, як очікуєте.
Рік Ганлон 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.


1
  1. @NotNull: обмежена CharSequence, Collection, Map або масив дійсні до тих пір, поки це не буде нульовим, але воно може бути порожнім
  2. @NotEmpty: обмежений CharSequence, Collection, Map або масив дійсний до тих пір, поки він не буде нульовим, а його розмір / довжина більше нуля.
  3. @NotBlank: обмежена рядок дійсна до тих пір, поки вона не буде нульовою і обрізана довжина більше нуля.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.