2013-06-16 11 views

Odpowiedz

230

@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):

  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; 
    } 
    
  2. @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.

  3. 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 ma isValid 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:

  1. String name = null;
    @NotNull: false
    @NotEmpty: false
    @NotBlank: false

  2. String name = "";
    @NotNull: prawda
    @NotEmpty: false
    @NotBlank: imię fałszywie

  3. String = "„;
    @NotNull: prawda
    @NotEmpty: prawda
    @NotBlank: false

  4. String name = "Great odpowiedź!";
    @NotNull: prawda
    @NotEmpty: prawda
    @NotBlank: prawda

+25

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/ –

+2

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

+1

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. –

1

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.

Powiązane problemy