Я, здається, не зможу знайти підсумок, який розрізняє різницю цих трьох анотацій.
Я, здається, не зможу знайти підсумок, який розрізняє різницю цих трьох анотацій.
Відповіді:
@NotNull
: Об'єкт CharSequence, Collection, Map або масив не є нульовим , але може бути порожнім.
@NotEmpty
: Об'єкт CharSequence, Collection, Map або масив не має нульового розміру> 0 .
@NotBlank
: Рядок не є нульовим, а обрізана довжина більше нуля .
Щоб допомогти вам зрозуміти, давайте розглянемо, як ці обмеження визначені та виконуються (я використовую версію 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
визначення якого відрізняється на основі об'єкта , але має бути саме explanitory.
Нарешті, @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
.
Ось кілька прикладів:
Назва рядка = null;
@NotNull
: false
@NotEmpty
: false
@NotBlank
: false
Ім'я рядка = "";
@NotNull
: true
@NotEmpty
: false
@NotBlank
: false
Ім'я рядка = "";
@NotNull
: true
@NotEmpty
: true
@NotBlank
: false
Рядок name = "Чудова відповідь!";
@NotNull
: true
@NotEmpty
: true
@NotBlank
: true
Мені сподобалось пояснення за посиланням нижче: http://www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/
@NotNull: перевіряє, чи значення не є нульовим, не зважаючи на вміст
@NotEmpty: Перевіряє, чи значення не є нулевим чи порожнім. Якщо в ньому просто порожні пробіли, це дозволить йому бути не порожнім.
@NotBlank: Перевіряє, чи є значення не нульовим чи порожнім, спочатку обрізаючи значення. Це означає, що він не дозволить просто порожні місця.
Отже, якщо ви хочете перевірити, що поле не є нульовим, але також, що воно має не просто порожні пробіли, а текст, слід використовувати @NotBlank.
@NotNull:
обмежена CharSequence, Collection, Map або масив дійсні до тих пір, поки це не буде нульовим, але воно може бути порожнім@NotEmpty:
обмежений CharSequence, Collection, Map або масив дійсний до тих пір, поки він не буде нульовим, а його розмір / довжина більше нуля.@NotBlank:
обмежена рядок дійсна до тих пір, поки вона не буде нульовою і обрізана довжина більше нуля.