Nie mogę znaleźć streszczenia, które odróżnia tę adnotację od siebie.W Hibernate Validator 4.1+, jaka jest różnica między @NotNull, @NotEmpty i @NotBlank?
Odpowiedz
@NotNull
: The CharSequence, Kolekcja, mapa lub Array obiekt nie jest null, ale może być pusta.
@NotEmpty
: Obiekt CharSequence, Collection, Map lub Array ma wartość null i rozmiar> 0.
@NotBlank
: Łańcuch nie ma wartości null , a przycięta długość jest większa niż zero.
Aby pomóc Ci zrozumieć, przyjrzyjmy się, jak te ograniczenia są zdefiniowane i prowadzone (używam wersji 4.1):
@NotNull
ograniczeniem jest zdefiniowany jako:@Constraint(validatedBy = {NotNullValidator.class})
Ta klasa ma metodę
isValid
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 wykorzystuje się
@NotNull
ograniczenie powyżej, i@Size
którego definicja różni się w zależności od obiektu, ale powinno być samo explanitory.Wreszcie
@NotBlank
ograniczeniem jest zdefiniowany jako:@NotNull @Constraint(validatedBy = {NotBlankValidator.class})
Więc to ograniczenie wykorzystuje również
@NotNull
ograniczenia, ale także ogranicza z klasą NotBlankValidator. Ta klasa maisValid
metodę zdefiniowaną jako:if (charSequence == null) { //curious return true; } return charSequence.toString().trim().length() > 0;
Co ciekawe, ta metoda zwraca true jeśli ciąg jest zerowy, ale fałszywa wtedy i tylko wtedy, gdy długość przyciętego ciąg wynosi 0. Jest ok, że zwraca true, jeśli jest pusty, ponieważ, jak już wspomniałem, definicja
@NotEmpty
wymaga również@NotNull
.
Oto kilka przykładów:
String name = null;
@NotNull
: false
@NotEmpty
: false
@NotBlank
: falseString name = "";
@NotNull
: prawda
@NotEmpty
: false
@NotBlank
: imię fałszywieString = "„;
@NotNull
: prawda
@NotEmpty
: prawda
@NotBlank
: falseString name = "Great odpowiedź!";
@NotNull
: prawda
@NotEmpty
: prawda
@NotBlank
: prawda
Podobało mi się wyjaśnienie w poniższy link: http://www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/
@NotNull: Sprawdza, czy wartość nie jest zerowy, nie zważając na treść
@NotEmpty: Sprawdza, czy wartość nie jest pusta, czy nie. Jeśli ma tylko puste przestrzenie, zezwala na to, że nie jest puste.
@NotBlank: Sprawdza, czy wartość nie jest pusta, czy pusta, najpierw przycinaj ją. Oznacza to, że nie pozwoli to na puste miejsca.
Tak więc, jeśli chcesz sprawdzić, czy pole nie ma wartości NULL, ale także, że nie ma tylko pustych spacji, ale tekst, powinieneś użyć @NotBlank.
Spędziłem trochę czasu, śledząc te informacje na własną rękę, a ja chciałem pomóc innym w czerpaniu korzyści z tego wysiłku. "Aby być krystalicznie czystym, nie wystarczy zapytać i odpowiedzieć na własne pytanie, jest to wyraźnie zalecane". http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ –
Moim zdaniem @NotBlank POWINNA zaakceptować wartość null. W niektórych przypadkach możesz zaakceptować wartość null dla pól opcjonalnych, w których puste jest po prostu nieprawidłowe. – tbraun
Zgodziłbym się z tym. Jeśli nie chcesz null, a nie pusty, możesz użyć obu. Ponieważ tak nie jest, możesz napisać własny weryfikator i użyć go zgodnie z oczekiwaniami. –