W Walidatorze Hibernate 4.1+, jaka jest różnica między @NotNull, @NotEmpty i @NotBlank?
Wydaje mi się, że nie jestem w stanie znaleźć podsumowania, które odróżniałoby różnicę między tymi trzema adnotacjami.
2 answers
@NotNull
: obiekt CharSequence, Collection, Map lub Array nie jest null, ale może być pusty.@NotEmpty
: obiekt CharSequence, Collection, Map lub Array nie ma wartości null i rozmiaru > 0.@NotBlank
: łańcuch nie jest null , a długość przycięcia jest większa niż zero .
Aby pomóc ci zrozumieć, przyjrzyjmy się, jak te ograniczenia są definiowane i realizowane (używam wersji 4.1):
-
Ograniczenie
@NotNull
jest zdefiniowany jako:@Constraint(validatedBy = {NotNullValidator.class})
Ta klasa ma metodę
isValid
zdefiniowaną jako:public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) { return object != null; }
-
Ograniczenie
@NotEmpty
jest zdefiniowane jako:@NotNull @Size(min = 1)
Więc to ograniczenie wykorzystuje ograniczenie
@NotNull
powyżej, i@Size
którego definicja różni się w zależności od przedmiotu, ale powinna być samoistna. -
Wreszcie, ograniczenie
@NotBlank
jest zdefiniowane jako:@NotNull @Constraint(validatedBy = {NotBlankValidator.class})
Więc to ograniczenie używa również ograniczenia
@NotNull
, ale także ograniczenia z klasą NotBlankValidator. Ta klasa ma metodęisValid
zdefiniowaną jako:if ( charSequence == null ) { //curious return true; } return charSequence.toString().trim().length() > 0;
Co ciekawe, metoda ta zwraca true, jeśli łańcuch jest null, ale false wtedy i tylko wtedy, gdy długość przyciętego łańcucha wynosi 0. W porządku, że zwraca true, jeśli jest null, ponieważ, jak wspomniałem, definicja
@NotEmpty
wymaga również@NotNull
.
Oto kilka przykładów:
-
String name = null;
@NotNull
: fałsz@NotEmpty
: false@NotBlank
: false -
String name = "";
@NotNull
: prawda@NotEmpty
: fałsz@NotBlank
: false -
String name = " ";
@NotNull
: prawda@NotEmpty
: prawda@NotBlank
: false String name = " świetna odpowiedź!";
@NotNull
: prawda@NotEmpty
: prawda@NotBlank
: prawda
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-16 21:11:12
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, pomijając zawartość
@ NotEmpty: sprawdza, czy wartość nie jest null ani pusta. Jeśli ma tylko puste przestrzenie, pozwoli na to jako nie puste.
@ NotBlank: sprawdza, czy wartość nie jest null ani pusta, najpierw przycinając wartość. To znaczy, że nie będzie Zezwalaj tylko na puste przestrzenie.
Więc, jeśli chcesz sprawdzić, czy pole nie jest null, ale także, że nie ma tylko pustych spacji, ale tekstu, powinieneś użyć @NotBlank.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-06 17:16:41