In Hibernate Validator 4.1+, qual è la differenza tra @NotNull, @NotEmpty e @NotBlank?


Risposte:


314

@NotNull: L'oggetto CharSequence, Collection, Map o Array non è nullo , ma può essere vuoto.
@NotEmpty: L'oggetto CharSequence, Collection, Map o Array non è nullo e la dimensione è> 0 .
@NotBlank: La stringa non è nulla e la lunghezza tagliata è maggiore di zero .

Per aiutarti a capire, esaminiamo come vengono definiti e applicati questi vincoli (sto usando la versione 4.1):

  1. Il @NotNullvincolo è definito come:

    @Constraint(validatedBy = {NotNullValidator.class})  

    Questa classe ha un isValidmetodo definito come:

    public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
     return object != null;  
    }
  2. Il @NotEmptyvincolo è definito come:

    @NotNull  
    @Size(min = 1)    

    Quindi questo vincolo usa il @NotNullvincolo di cui sopra e la @Size cui definizione differisce in base all'oggetto ma dovrebbe essere autoesplicativo.

  3. Infine, il @NotBlankvincolo è definito come:

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

    Quindi questo vincolo utilizza anche il @NotNullvincolo, ma vincola anche con la classe NotBlankValidator. Questa classe ha un isValidmetodo definito come:

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

    È interessante notare che questo metodo restituisce true se la stringa è nulla, ma false se e solo se la lunghezza della stringa tagliata è 0. Va bene che restituisca true se è null perché, come ho detto, anche la @NotEmptydefinizione richiede @NotNull.

Ecco alcuni esempi:

  1. Nome stringa = null;
    @NotNull: false
    @NotEmpty: false
    @NotBlank: false

  2. Nome stringa = "";
    @NotNull: vero
    @NotEmpty : falso
    @NotBlank: falso

  3. Nome stringa = "";
    @NotNull: vero
    @NotEmpty : vero
    @NotBlank : falso

  4. String name = "Ottima risposta!";
    @NotNull: vero
    @NotEmpty : vero
    @NotBlank : vero


29
Ho passato un po 'di tempo a rintracciare queste informazioni da solo e volevo aiutare gli altri a trarre vantaggio da questo sforzo. "Per essere chiari, non è solo OK chiedere e rispondere alla tua domanda, è esplicitamente incoraggiato." blog.stackoverflow.com/2011/07/…
Rick Hanlon II

4
A mio parere, @NotBlank DOVREBBE accettare null. Ci sono alcuni casi in cui accetteresti null per i campi facoltativi in ​​cui lo spazio vuoto non è valido.
tbraun

1
Sono d'accordo con quello. Se non vuoi nullo e non vuoto, puoi usare entrambi. Dato che non è così, potresti scrivere il tuo validatore e usarlo come ti aspetti.
Rick Hanlon II

1
Solo una nota: @NotNull può essere utilizzato con qualsiasi oggetto, non solo "CharSequence, Collection, Map o Array"; come del resto mostra il codice che hai inserito al punto 1.
Niccolò

@RickHanlonII Potresti suggerire come viene convalidato in Hibernate Validator 5+. Non sembra essere qualsiasi ConstraintValidatorassociato a queste annotazioni più .
Steve

7

Mi è piaciuta la spiegazione nel link sottostante: http://www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/

@NotNull: controlla se il valore non è nullo, ignorando il contenuto

@NotEmpty: controlla se il valore non è nullo né vuoto. Se ha solo spazi vuoti, lo consentirà come non vuoto.

@NotBlank: controlla se il valore non è nullo né vuoto, tagliando prima il valore. Significa che non consentirà solo spazi vuoti.

Quindi, se vuoi convalidare che un campo non è nullo ma anche che non ha solo spazi vuoti, ma testo, dovresti usare @NotBlank.


1
  1. @NotNull: una CharSequence, Collection, Map o Array vincolata è valida fintanto che non è nulla, ma può essere vuota
  2. @NotEmpty: una CharSequence, Collection, Map o Array vincolata è valida fintanto che non è nulla e la sua dimensione / lunghezza è maggiore di zero.
  3. @NotBlank: una stringa vincolata è valida fintanto che non è nulla e la lunghezza ridotta è maggiore di zero.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.