Validated, Valid, Validator: Apakah Anda Mengetahui Perbedaannya?

Tag Terkait:1. Alibaba Cloud Menyediakan HSM Tervalidasi FIPS untuk Keamanan Kunci Kripto
2. Validitas nama domain

Validated, Valid, Validator: Apakah Anda Mengetahui Perbedaannya?

1. Utamakan Kesimpulan
Kesamaan Valid VS Validated
•Metode dan parameter dapat divalidasi
•Anotasi @Valid dan @Validated keduanya menerapkan validasi bean standar.
Jika validasi gagal, BindException akan dilemparkan dan respons 400 (BAD_REQUEST) akan dikembalikan; atau error validasi dapat ditangani secara lokal di controller melalui parameter Errors atau BindingResult. Selain itu, jika ada anotasi @RequestBody sebelum parameter, error validasi akan melemparkan exception MethodArgumentNotValidException.
JSR 380
JSR 380 adalah spesifikasi API Java untuk validasi bean dan merupakan bagian dari Jakarta EE dan JavaSE. Ini memastikan bahwa properti bean memenuhi kondisi tertentu, menggunakan anotasi seperti @NotNull, @Min, dan @Max.

Rilis ini memerlukan Java 8 atau versi lebih baru dan memanfaatkan fitur baru yang ditambahkan di Java 8, seperti type annotations dan dukungan untuk tipe baru seperti Optional dan LocalDate.
Untuk informasi lengkap tentang spesifikasi, lanjutkan membaca JSR 380.

Apa perbedaan antara Valid VS Validated?


javax.validation.Valid _
oMerupakan dukungan anotasi standar spesifikasi JSR-303, yaitu anotasi penanda.
oAnotasi mendukung ElementType#METHOD, ElementType#FIELD, ElementType#CONSTRUCTOR,
oElementType#PARAMETER, ElementType#TYPE_USE
•org.springframework.validation.annotation.Validated _
oIni adalah anotasi kustom buatan Spring yang meningkatkan fungsi pengelompokan.
oAnotasi mendukung ElementType#TYPE, ElementType#METHOD, ElementType#PARAMETER
Perbedaan antara @Valid dan @Validated

Validated, Valid, Validator.Validator


Bean Validation 2.0 (JSR 380) mendefinisikan model metadata dan API untuk validasi entitas dan metode, dan Hibernate Validator adalah implementasi terbaik saat ini
Interface Validator memiliki tiga metode yang dapat digunakan untuk memvalidasi seluruh entitas atau hanya satu properti dari entitas
•Validator#validate() memvalidasi semua constraint pada semua bean
•Validator#validateProperty() memvalidasi satu properti
•Validator#validateValue() memeriksa apakah satu properti dari kelas tertentu dapat divalidasi dengan berhasil
Baik itu verifikasi parameter requestBody maupun verifikasi tingkat metode, Hibernate Validator akhirnya dipanggil untuk melakukan verifikasi, dan Spring Validation hanya melakukan lapisan enkapsulasi.
Memvalidasi input pengguna adalah fitur umum di sebagian besar aplikasi kita. Di ekosistem Java, kami menggunakan Java Standard Bean Validation API secara eksklusif untuk mendukung ini. Juga, mulai versi 4.0, ini juga terintegrasi dengan baik dengan Spring.
Di bagian berikutnya, mari kita pahami secara detail.

Anotasi @Valid dan @Validated
Di Spring, kami menggunakan anotasi @Valid dari JSR-303 untuk validasi tingkat metode. Kami juga menggunakannya untuk menandai properti anggota untuk validasi. Namun, anotasi ini tidak mendukung validasi grup.
Grup membantu membatasi constraint yang diterapkan selama validasi. Kasus penggunaan khusus adalah wizard UI. Di sini, pada langkah pertama, kami mungkin memiliki beberapa subgrup bidang. Pada langkah berikutnya, mungkin ada grup lain yang milik bean yang sama. Jadi kami perlu menerapkan constraint pada bidang terbatas ini di setiap langkah, tetapi @Valid tidak mendukung ini.
Dalam hal ini, untuk tingkat grup, kami harus menggunakan @Validated dari Spring, yang merupakan varian dari @Valid JSR-303. Ini digunakan pada tingkat metode. Untuk properti anggota penanda, kami terus menggunakan anotasi @Valid.
Sekarang, mari kita langsung lihat penggunaan anotasi ini dengan contoh.



3. Contoh


Mari kita pertimbangkan pendaftaran pengguna sederhana yang dikembangkan dengan Spring Boot. Pertama, kami hanya akan memiliki properti nama dan kata sandi:

Setelah mengonfirmasi bahwa tes berjalan dengan berhasil, kami sekarang memperluas fungsionalitas. Langkah logis berikutnya adalah mengubahnya menjadi pendaftaran pengguna yang kompleks. Untuk langkah pertama, nama dan kata sandi tetap sama. Pada langkah kedua, kami akan mendapatkan informasi tambahan seperti usia dan telepon. Jadi kami akan memperbarui objek domain kami dengan bidang tambahan ini:

Namun, kali ini kami akan melihat bahwa tes sebelumnya gagal. Ini karena kami tidak memasukkan bidang usia dan telepon. Untuk mendukung perilaku ini, kami memerlukan validasi grup dan anotasi @Validated.

Untuk melakukannya, kami perlu mengelompokkan bidang, membuat dua grup berbeda. Pertama, kami perlu membuat dua interface penanda. Satu untuk setiap grup atau setiap langkah secara individual. Kami dapat merujuk ke artikel kami tentang validasi grup untuk melihat bagaimana hal ini diimplementasikan. Di sini, mari kita fokus pada perbedaan dalam anotasi.
Kami akan memiliki interface BasicInfo untuk langkah pertama dan AdvanceInfo untuk langkah kedua. Selain itu, kami akan memperbarui kelas UserAccount untuk menggunakan interface penanda ini sebagai berikut:
Selanjutnya, mari kita lihat bagaimana @Valid memicu validasi properti bersarang.

Validated, Valid, Validator. Gunakan @Valid untuk Validasi Bersarang


Anotasi @Valid digunakan untuk memvalidasi properti bersarang. Ini memicu validasi objek bersarang. Misalnya, dalam skenario kami saat ini, mari buat Objek UserAddress:
5. Menggabungkan @Valid dan @Validated untuk melakukan pemeriksaan set
Jika body request langsung meneruskan array json ke backend, dan Anda ingin melakukan verifikasi parameter pada setiap item dalam array. Pada titik ini, jika kami langsung menggunakan list atau set di bawah java.util.Collection untuk menerima data, verifikasi parameter tidak akan berlaku! Kami dapat menggunakan koleksi list kustom untuk menerima parameter:
•Wrap tipe List dan deklarasikan anotasi @Valid
package com.devicemag.core.BO;

import javax.validation.Valid ; _
import java.util .*;

Validated, Valid, Validator. Kesimpulan

Validated, Valid, Validator. Sebagai kesimpulan, untuk validasi dasar apa pun, kami akan menggunakan anotasi JSR @Valid pada pemanggilan metode. Di sisi lain, untuk validasi grup apa pun, termasuk urutan grup, kami perlu menggunakan anotasi @Validated dari Spring dalam pemanggilan metode kami. Anotasi @Valid juga diperlukan untuk memicu validasi properti bersarang.
Validated masih berupa AOP. Dalam verifikasi metode, metode intersepsi dinamis AOP digunakan, dan JSR303 Validator digunakan untuk menyelesaikan verifikasi. Dalam verifikasi atribut Bean, ini didasarkan pada siklus hidup Bean, dan verifikasi diselesaikan sebelum dan setelah inisialisasinya.
phone Hubungi Kami
Hi, I'm Alibaba Cloud AI Assistant!
I can help with questions and solutions.