Hibernate Validator 4.1+ sürümünde @NotNull, @NotEmpty ve @NotBlank arasındaki fark nedir?


Yanıtlar:


314

@NotNull: CharSequence, Collection, Map veya Array nesnesi boş değildir , ancak boş olabilir .
@NotEmpty: CharSequence, Collection, Map veya Array nesnesi boş değil ve boyut> 0 .
@NotBlank: Dize boş değil ve kırpılan uzunluk sıfırdan büyük .

Anlamanıza yardımcı olmak için, bu kısıtlamaların nasıl tanımlandığına ve uygulandığına bakalım (4.1 sürümünü kullanıyorum):

  1. @NotNullKısıtlama şu şekilde tanımlanır:

    @Constraint(validatedBy = {NotNullValidator.class})  

    Bu sınıfın şu şekilde isValidtanımlanan bir yöntemi vardır :

    public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
     return object != null;  
    }
  2. @NotEmptyKısıtlama şu şekilde tanımlanır:

    @NotNull  
    @Size(min = 1)    

    Yani bu kısıtlama kullanır@NotNull yukarıdaki kısıtlamayı, ve @Size kimin tanım farklılık nesneye dayalı ama kendini explanitory olmalıdır.

  3. Son olarak, @NotBlankkısıtlama şu şekilde tanımlanır:

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

    Dolayısıyla bu kısıtlama aynı zamanda kısıtlamayı kullanır @NotNull, ancak NotBlankValidator sınıfıyla da kısıtlar. Bu sınıfın şu şekilde isValidtanımlanan bir yöntemi vardır :

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

    İlginç bir şekilde, bu yöntem dizge null ise true döndürür, ancak ancak ve ancak kesilen dizenin uzunluğu 0 ise false döndürür. Boşsa doğru döndürmesi sorun değil çünkü bahsettiğim gibi @NotEmptytanım da gerektirir @NotNull.

İşte birkaç örnek:

  1. Dize adı = boş;
    @NotNull: yanlış
    @NotEmpty: yanlış
    @NotBlank: yanlış

  2. Dize adı = "";
    @NotNull: true
    @NotEmpty : false
    @NotBlank: yanlış

  3. Dize adı = "";
    @NotNull: true
    @NotEmpty : true
    @NotBlank : yanlış

  4. String name = "Harika yanıt!";
    @NotNull: true
    @NotEmpty : true
    @NotBlank : true


29
Bu bilgiyi kendi başıma takip etmek için biraz zaman harcadım ve başkalarının bu çabadan yararlanmasına yardımcı olmak istedim. "Çok net olmak gerekirse, kendi sorunuzu sormanız ve yanıtlamanız yalnızca uygun değildir, açıkça teşvik edilmektedir." blog.stackoverflow.com/2011/07/…
Rick Hanlon II

4
Bana göre, @NotBlank null kabul etmelidir. Boşluğun geçersiz olduğu isteğe bağlı alanlar için boş kabul edeceğiniz bazı durumlar vardır.
tbraun

1
Ben buna katılıyorum. Null ve boş olmamak istiyorsanız, ikisini de kullanabilirsiniz. Durum böyle olmadığından, kendi doğrulayıcınızı yazabilir ve bunu beklediğiniz gibi kullanabilirsiniz.
Rick Hanlon II

1
Sadece bir not: @NotNull, sadece "CharSequence, Collection, Map veya Array" ile değil, herhangi bir Nesne ile kullanılabilir; aslında 1. maddeye eklediğiniz kodun gösterdiği gibi.
Niccolò

@RickHanlonII Hibernate Validator 5+ ile nasıl doğrulanacağını önerebilir misiniz? ArtıkConstraintValidator bu ek açıklamalarla ilişkili görünmüyor .
Steve

7

Aşağıdaki bağlantıdaki açıklamayı beğendim: http://www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/

@NotNull: İçeriği göz ardı ederek değerin boş olup olmadığını kontrol eder

@NotEmpty: Değerin null veya boş olup olmadığını kontrol eder. Sadece boş alanları varsa, boş olmamasına izin verecektir.

@NotBlank: Değerin null veya boş olup olmadığını kontrol eder, önce değeri keser. Bu, sadece boş alanlara izin vermeyeceği anlamına gelir.

Öyleyse, bir alanın boş olmadığını, aynı zamanda sadece boş boşluklar olmadığını, ancak metin içerdiğini doğrulamak istiyorsanız, @NotBlank kullanmalısınız.


1
  1. @NotNull: kısıtlanmış bir CharSequence, Collection, Map veya Array, boş olmadığı sürece geçerlidir, ancak boş olabilir
  2. @NotEmpty: kısıtlanmış bir CharSequence, Collection, Map veya Array, boş olmadığı ve boyutu / uzunluğu sıfırdan büyük olduğu sürece geçerlidir.
  3. @NotBlank: kısıtlanmış bir Dize, boş olmadığı ve kesilen uzunluk sıfırdan büyük olduğu sürece geçerlidir.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.