Di Hibernate Validator 4.1+, apa perbedaan antara @NotNull, @NotEmpty, dan @NotBlank?

114

Sepertinya saya tidak dapat menemukan ringkasan yang membedakan perbedaan antara ketiga anotasi ini.

Rick Hanlon II
sumber

Jawaban:

314

@NotNull: Objek CharSequence, Collection, Map atau Array tidak null , tetapi bisa kosong.
@NotEmpty: Objek CharSequence, Collection, Map atau Array bukan null dan size> 0 .
@NotBlank: String tidak nol dan panjang yang dipotong lebih besar dari nol .

Untuk membantu Anda memahami, mari kita lihat bagaimana batasan ini didefinisikan dan dijalankan (saya menggunakan versi 4.1):

  1. The @NotNullkendala didefinisikan sebagai:

    @Constraint(validatedBy = {NotNullValidator.class})  

    Kelas ini memiliki isValidmetode yang didefinisikan sebagai:

    public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
     return object != null;  
    }
    
  2. The @NotEmptykendala didefinisikan sebagai:

    @NotNull  
    @Size(min = 1)    
    

    Jadi kendala ini menggunakan satu @NotNullkendala di atas, dan @Size yang definisinya berbeda berdasarkan pada objek tetapi harus explanitory diri.

  3. Terakhir, @NotBlankbatasan didefinisikan sebagai:

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

    Jadi batasan ini juga menggunakan @NotNullbatasan, tetapi juga batasan dengan kelas NotBlankValidator. Kelas ini memiliki isValidmetode yang didefinisikan sebagai:

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

    Menariknya, metode ini mengembalikan nilai true jika stringnya null, tetapi false jika dan hanya jika panjang string yang dipotong 0. Tidak apa-apa jika ia mengembalikan true jika null karena, seperti yang saya sebutkan, @NotEmptydefinisi juga memerlukan @NotNull.

Berikut beberapa contohnya:

  1. Nama string = null;
    @NotNull: false
    @NotEmpty: false
    @NotBlank: false

  2. Nama string = "";
    @NotNull: benar
    @NotEmpty : salah
    @NotBlank: salah

  3. Nama string = "";
    @NotNull: benar
    @NotEmpty : benar
    @NotBlank : salah

  4. String name = "Jawaban bagus!";
    @NotNull: benar
    @NotEmpty : benar
    @NotBlank : benar

Rick Hanlon II
sumber
29
Saya menghabiskan beberapa waktu melacak informasi ini sendiri, dan saya ingin membantu orang lain mendapatkan keuntungan dari upaya itu. "Untuk lebih jelasnya, tidak hanya boleh bertanya dan menjawab pertanyaan Anda sendiri, tapi juga secara eksplisit didorong." blog.stackoverflow.com/2011/07/…
Rick Hanlon II
4
Menurut saya, @NotBlank HARUS menerima null. Ada beberapa kasus Anda akan menerima null untuk bidang opsional di mana kosong tidak valid.
tbraun
1
Saya setuju dengan itu. Jika Anda ingin tidak null dan tidak kosong, Anda bisa menggunakan keduanya. Karena bukan itu masalahnya, Anda dapat menulis validator Anda sendiri dan menggunakannya seperti yang Anda harapkan.
Rick Hanlon II
1
Sekadar catatan: @NotNull dapat digunakan dengan Objek apa pun, tidak hanya "CharSequence, Collection, Map, atau Array"; karena memang kode yang Anda masukkan pada poin 1 menunjukkan.
Niccolò
@RickHanlonII Bisakah Anda menyarankan bagaimana mendapatkan divalidasi dalam Hibernate Validator 5+. Ada tampaknya tidak akan setiap ConstraintValidatordikaitkan dengan penjelasan ini lagi .
Steve
7

Saya menyukai penjelasan di tautan di bawah ini: http://www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/

@NotNull: Memeriksa apakah nilainya bukan null, mengabaikan konten

@NotEmpty: Memeriksa apakah nilainya tidak nol atau kosong. Jika hanya memiliki ruang kosong, itu akan memungkinkannya sebagai tidak kosong.

@NotBlank: Memeriksa apakah nilainya tidak null atau kosong, terlebih dahulu memotong nilainya. Artinya, tidak hanya ada ruang kosong.

Jadi, jika Anda ingin memvalidasi bahwa suatu bidang tidak null tetapi juga tidak hanya memiliki spasi kosong, tetapi teks, Anda harus menggunakan @NotBlank.

Pratiksha
sumber
1
  1. @NotNull: CharSequence, Collection, Map, atau Array yang dibatasi valid selama tidak null, tetapi boleh kosong
  2. @NotEmpty: CharSequence, Collection, Map, atau Array yang dibatasi valid selama tidak null dan ukuran / panjangnya lebih besar dari nol.
  3. @NotBlank: String yang dibatasi valid selama tidak null dan panjang yang dipotong lebih besar dari nol.
Mukesh Kumar Gupta
sumber