Was ist in Hibernate Validator 4.1+ der Unterschied zwischen @NotNull, @NotEmpty und @NotBlank?

114

Ich kann anscheinend keine Zusammenfassung finden, die den Unterschied zwischen diesen drei Anmerkungen unterscheidet.

Rick Hanlon II
quelle

Antworten:

314

@NotNull: Das CharSequence-, Collection-, Map- oder Array-Objekt ist nicht null , kann jedoch leer sein.
@NotEmpty: Das CharSequence-, Collection-, Map- oder Array-Objekt ist nicht null und hat eine Größe> 0 .
@NotBlank: Die Zeichenfolge ist nicht null und die zugeschnittene Länge ist größer als null .

Schauen wir uns zum besseren Verständnis an, wie diese Einschränkungen definiert und ausgeführt werden (ich verwende Version 4.1):

  1. Die @NotNullEinschränkung ist definiert als:

    @Constraint(validatedBy = {NotNullValidator.class})  

    Diese Klasse hat eine isValidMethode definiert als:

    public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
     return object != null;  
    }
  2. Die @NotEmptyEinschränkung ist definiert als:

    @NotNull  
    @Size(min = 1)    

    Also diese Einschränkung verwendet die @NotNullEinschränkung oben, und @Size deren Definition unterscheidet sich die Aufgabe zugrunde , sondern sollte selbsterklärend sein.

  3. Schließlich ist die @NotBlankEinschränkung definiert als:

    @NotNull  
    @Constraint(validatedBy = {NotBlankValidator.class})        

    Diese Einschränkung verwendet also auch die @NotNullEinschränkung, aber auch Einschränkungen mit der NotBlankValidator-Klasse. Diese Klasse hat eine isValidMethode definiert als:

    if ( charSequence == null ) {  //curious 
      return true;   
    }   
    return charSequence.toString().trim().length() > 0;  

    Interessanterweise gibt diese Methode true zurück, wenn die Zeichenfolge null ist, aber nur dann false, wenn die Länge der zugeschnittenen Zeichenfolge 0 beträgt. Es ist in Ordnung, dass sie true zurückgibt, wenn sie null ist, da die @NotEmptyDefinition , wie bereits erwähnt, ebenfalls erforderlich ist @NotNull.

Hier einige Beispiele:

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

  2. String name = "";
    @NotNull: true
    @NotEmpty : false
    @NotBlank: false

  3. String name = "";
    @NotNull: true
    @NotEmpty : true
    @NotBlank : false

  4. String name = "Großartige Antwort!";
    @NotNull: wahr
    @NotEmpty : wahr
    @NotBlank : wahr

Rick Hanlon II
quelle
29
Ich habe einige Zeit damit verbracht, diese Informationen selbst aufzuspüren, und ich wollte anderen helfen, von diesen Bemühungen zu profitieren. "Um ganz klar zu sein, ist es nicht nur in Ordnung, eigene Fragen zu stellen und zu beantworten, es wird ausdrücklich empfohlen." blog.stackoverflow.com/2011/07/…
Rick Hanlon II
4
Meiner Meinung nach sollte @NotBlank null akzeptieren. In einigen Fällen würden Sie null für optionale Felder akzeptieren, in denen leer nur ungültig ist.
Tbraun
1
Dem würde ich zustimmen. Wenn Sie nicht null und nicht leer möchten, können Sie beide verwenden. Da dies nicht der Fall ist, können Sie Ihren eigenen Validator schreiben und diesen wie erwartet verwenden.
Rick Hanlon II
1
Nur eine Anmerkung: @NotNull kann mit jedem Objekt verwendet werden, nicht nur mit "CharSequence, Collection, Map oder Array". wie in der Tat der Code zeigt, den Sie in Punkt 1 eingefügt haben.
Niccolò
@RickHanlonII Könnten Sie vorschlagen, wie es in Hibernate Validator 5+ validiert wird? ConstraintValidatorMit diesen Anmerkungen scheint keine Verbindung mehr verbunden zu sein .
Steve
7

Die Erklärung im folgenden Link hat mir gefallen: http://www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/

@NotNull: Überprüft, ob der Wert nicht null ist, wobei der Inhalt nicht berücksichtigt wird

@NotEmpty: Überprüft, ob der Wert weder null noch leer ist. Wenn es nur leere Leerzeichen hat, wird es als nicht leer zugelassen.

@NotBlank: Überprüft, ob der Wert weder null noch leer ist, und schneidet zuerst den Wert ab. Dies bedeutet, dass nicht nur Leerzeichen zugelassen werden.

Wenn Sie also überprüfen möchten, dass ein Feld nicht null ist, sondern auch nicht nur Leerzeichen, sondern auch Text enthält, sollten Sie @NotBlank verwenden.

Pratiksha
quelle
1
  1. @NotNull: Eine eingeschränkte CharSequence, Collection, Map oder Array ist gültig, solange sie nicht null ist, aber leer sein kann
  2. @NotEmpty: Eine eingeschränkte CharSequence, Collection, Map oder Array ist gültig, solange sie nicht null ist und ihre Größe / Länge größer als null ist.
  3. @NotBlank: Ein eingeschränkter String ist gültig, solange er nicht null ist und die zugeschnittene Länge größer als null ist.
Mukesh Kumar Gupta
quelle