No Hibernate Validator 4.1+, qual é a diferença entre @NotNull, @NotEmpty e @NotBlank?

Respostas:

314

@NotNull: O objeto CharSequence, Collection, Map ou Array não é nulo , mas pode estar vazio.
@NotEmpty: O objeto CharSequence, Collection, Map ou Array não é nulo e tem tamanho> 0 .
@NotBlank: A string não é nula e o comprimento aparado é maior que zero .

Para ajudá-lo a entender, vamos ver como essas restrições são definidas e realizadas (estou usando a versão 4.1):

  1. A @NotNullrestrição é definida como:

    @Constraint(validatedBy = {NotNullValidator.class})  

    Esta classe possui um isValidmétodo definido como:

    public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
     return object != null;  
    }
  2. A @NotEmptyrestrição é definida como:

    @NotNull  
    @Size(min = 1)    

    Portanto, essa restrição usa a @NotNullrestrição acima e @Size cuja definição difere com base no objeto, mas deve ser autoexplicativa.

  3. Finalmente, a @NotBlankrestrição é definida como:

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

    Portanto, essa restrição também usa a @NotNullrestrição, mas também restringe com a classe NotBlankValidator. Esta classe possui um isValidmétodo definido como:

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

    Curiosamente, este método retorna verdadeiro se a string for nula, mas falso se e somente se o comprimento da string aparada for 0. Está tudo bem que ele retorne verdadeiro se for nulo porque, como mencionei, o @NotEmpty definição também exige @NotNull.

Aqui estão alguns exemplos:

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

  2. Nome da string = "";
    @NotNull: verdadeiro
    @NotEmpty : falso
    @NotBlank : falso

  3. Nome da string = "";
    @NotNull: true
    @NotEmpty : true
    @NotBlank : falso

  4. String name = "Ótima resposta!";
    @NotNull: verdadeiro
    @NotEmpty : verdadeiro
    @NotBlank : verdadeiro

Rick Hanlon II
fonte
29
Passei algum tempo rastreando essas informações por conta própria e queria ajudar outras pessoas a se beneficiarem desse esforço. "Para ser absolutamente claro, não é apenas OK fazer e responder às suas próprias perguntas, é explicitamente encorajado." blog.stackoverflow.com/2011/07/…
Rick Hanlon II
4
Na minha opinião, @NotBlank DEVE aceitar null. Existem alguns casos em que você aceitaria nulo para campos opcionais onde em branco é apenas inválido.
tbraun
1
Eu concordo com isso. Se você quiser não nulo e não vazio, poderá usar os dois. Como esse não é o caso, você pode escrever seu próprio validador e usá-lo conforme o esperado.
Rick Hanlon II
1
Apenas uma nota: @NotNull pode ser usado com qualquer objeto, não apenas "CharSequence, Collection, Map ou Array"; como de fato o código que você inseriu no ponto 1 mostra.
Niccolò
@RickHanlonII Você poderia sugerir como ele está sendo validado no Hibernate Validator 5+. Não parece ser qualquer ConstraintValidatorassociado a estas anotações por mais tempo .
Steve
7

Gostei da explicação no link abaixo: http://www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/

@NotNull: verifica se o valor não é nulo, desconsiderando o conteúdo

@NotEmpty: verifica se o valor não é nulo nem vazio. Se tiver apenas espaços vazios, permitirá que não esteja vazio.

@NotBlank: verifica se o valor não é nulo nem vazio, cortando o valor primeiro. Isso significa que não permitirá apenas espaços vazios.

Portanto, se você deseja validar que um campo não é nulo, mas também que não contém apenas espaços vazios, mas texto, você deve usar @NotBlank.

Pratiksha
fonte
1
  1. @NotNull: um CharSequence, Collection, Map ou Array restrito é válido desde que não seja nulo, mas pode estar vazio
  2. @NotEmpty: um CharSequence, Collection, Map ou Array restrito é válido desde que não seja nulo e seu tamanho / comprimento seja maior que zero.
  3. @NotBlank: uma String restrita é válida desde que não seja nula e o comprimento aparado seja maior que zero.
Mukesh Kumar Gupta
fonte