Nie mogę znaleźć podsumowania, które odróżniałoby różnicę między tymi trzema adnotacjami.
Nie mogę znaleźć podsumowania, które odróżniałoby różnicę między tymi trzema adnotacjami.
Odpowiedzi:
@NotNull
: Obiekt CharSequence, Collection, Map lub Array nie ma wartości NULL , ale może być pusty.
@NotEmpty
: Obiekt CharSequence, Collection, Map lub Array nie ma wartości NULL i ma rozmiar> 0 .
@NotBlank
: Ciąg nie jest pusty, a przycięta długość jest większa od zera .
Aby pomóc Ci zrozumieć, przyjrzyjmy się, jak te ograniczenia są definiowane i wykonywane (używam wersji 4.1):
@NotNull
Ograniczeniem jest zdefiniowany jako:
@Constraint(validatedBy = {NotNullValidator.class})
Ta klasa ma isValid
metodę zdefiniowaną jako:
public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
return object != null;
}
@NotEmpty
Ograniczeniem jest zdefiniowany jako:
@NotNull
@Size(min = 1)
Więc to ograniczenie stosuje się @NotNull
ograniczenie powyżej, a @Size
którego definicja różni się w zależności od obiektu, ale powinna być jasna explanitory.
Ostatecznie @NotBlank
ograniczenie definiuje się jako:
@NotNull
@Constraint(validatedBy = {NotBlankValidator.class})
Więc to ograniczenie również używa @NotNull
ograniczenia, ale także ogranicza się z klasą NotBlankValidator. Ta klasa ma isValid
metodę zdefiniowaną jako:
if ( charSequence == null ) { //curious
return true;
}
return charSequence.toString().trim().length() > 0;
Co ciekawe, ta metoda zwraca prawdę, jeśli ciąg jest pusty, ale fałsz wtedy i tylko wtedy, gdy długość przyciętego ciągu wynosi 0. W porządku, że zwraca wartość true, jeśli jest pusty, ponieważ, jak wspomniałem, @NotEmpty
definicja również wymaga @NotNull
.
Oto kilka przykładów:
Nazwa ciągu = null;
@NotNull
: false
@NotEmpty
: false
@NotBlank
: false
Nazwa ciągu = "";
@NotNull
: prawda
@NotEmpty
: fałsz
@NotBlank
: fałsz
Nazwa ciągu = "";
@NotNull
: prawda
@NotEmpty
: prawda
@NotBlank
: fałsz
Nazwa ciągu = "Świetna odpowiedź!";
@NotNull
: prawda
@NotEmpty
: prawda
@NotBlank
: prawda
ConstraintValidator
adnotacje nie są już powiązane .
Podobało mi się wyjaśnienie w poniższym linku: http://www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/
@NotNull: sprawdza, czy wartość nie jest null, ignorując zawartość
@NotEmpty: sprawdza, czy wartość nie jest zerowa ani pusta. Jeśli ma tylko puste spacje, pozwoli to jako niepuste.
@NotBlank: sprawdza, czy wartość nie jest zerowa ani pusta, najpierw przycinając wartość. Oznacza to, że nie pozwoli tylko na puste przestrzenie.
Tak więc, jeśli chcesz sprawdzić, czy pole nie jest puste, ale także że zawiera nie tylko puste spacje, ale tekst, powinieneś użyć @NotBlank.
@NotNull:
ograniczona CharSequence, Collection, Map lub Array jest ważna, o ile nie ma wartości null, ale może być pusta@NotEmpty:
ograniczona CharSequence, Collection, Map lub Array jest prawidłowa, o ile nie ma wartości null, a jej rozmiar / długość jest większa niż zero.@NotBlank:
ograniczony String jest ważny, o ile nie jest null, a przycięta długość jest większa od zera.