Dasar-dasar Validasi Java Bean

1. Ikhtisar

Dalam tutorial singkat ini, kami membahas dasar-dasar memvalidasi kacang Java dengan kerangka kerja standar - JSR 380, juga dikenal sebagai Validasi Bean 2.0 .

Memvalidasi masukan pengguna adalah persyaratan yang sangat umum di sebagian besar aplikasi. Dan kerangka Validasi Java Bean telah menjadi standar de facto untuk menangani logika semacam ini.

2. JSR 380

JSR 380 adalah spesifikasi Java API untuk validasi kacang, bagian dari Jakarta EE dan JavaSE. Ini memastikan bahwa properti kacang memenuhi kriteria tertentu, menggunakan anotasi seperti @NotNull , @Min , dan @Max .

Versi ini membutuhkan Java 8 atau lebih tinggi, dan memanfaatkan fitur baru yang ditambahkan di Java 8, seperti anotasi jenis dan dukungan untuk jenis baru seperti Opsional dan Tanggal Lokal .

Untuk informasi lengkap tentang spesifikasinya, lanjutkan dan baca JSR 380.

3. Ketergantungan

Kami akan menggunakan contoh Maven untuk menunjukkan dependensi yang diperlukan. Namun tentunya toples tersebut bisa ditambahkan dengan berbagai cara.

3.1. API Validasi

Sesuai spesifikasi JSR 380, ketergantungan validation-api berisi API validasi standar:

 javax.validation validation-api 2.0.1.Final 

3.2. Penerapan Referensi API Validasi

Hibernate Validator adalah implementasi referensi dari validation API.

Untuk menggunakannya, kita perlu menambahkan dependensi berikut:

 org.hibernate.validator hibernate-validator 6.0.13.Final  

Catatan singkat: hibernate-validator sepenuhnya terpisah dari aspek persistensi Hibernate. Jadi, dengan menambahkannya sebagai dependensi, kami tidak menambahkan aspek ketekunan ini ke dalam proyek.

3.3. Ketergantungan Bahasa Ekspresi

JSR 380 mendukung interpolasi variabel, memungkinkan ekspresi di dalam pesan pelanggaran.

Untuk mengurai ekspresi ini, kita akan menambahkan dependensi javax.el dari GlassFish, yang berisi implementasi spesifikasi Bahasa Ekspresi:

 org.glassfish javax.el 3.0.0 

4. Menggunakan Anotasi Validasi

Di sini, kita akan mengambil kacang Pengguna dan bekerja menambahkan beberapa validasi sederhana ke dalamnya:

import javax.validation.constraints.AssertTrue; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import javax.validation.constraints.Email; public class User { @NotNull(message = "Name cannot be null") private String name; @AssertTrue private boolean working; @Size(min = 10, max = 200, message = "About Me must be between 10 and 200 characters") private String aboutMe; @Min(value = 18, message = "Age should not be less than 18") @Max(value = 150, message = "Age should not be greater than 150") private int age; @Email(message = "Email should be valid") private String email; // standard setters and getters } 

Semua anotasi yang digunakan dalam contoh adalah anotasi JSR standar:

  • @NotNull memvalidasi bahwa nilai properti yang dianotasi bukan null .
  • @AssertTrue memvalidasi bahwa nilai properti yang dianotasi benar.
  • @Size memvalidasi bahwa nilai properti yang dianotasi memiliki ukuran antara atribut min dan max ; dapat diterapkan ke properti String , Collection , Map , dan array.
  • @Min memvalidasi bahwa properti beranotasi memiliki nilai yang tidak lebih kecil dariatribut nilai .
  • @Max memvalidasi bahwa properti beranotasi memiliki nilai yang tidak lebih besar dariatribut nilai .
  • @Email memvalidasi bahwa properti yang dianotasi adalah alamat email yang valid.

Beberapa anotasi menerima atribut tambahan, tetapi atribut pesan umum untuk semuanya. Ini adalah pesan yang biasanya akan diberikan ketika nilai properti masing-masing gagal validasi.

Dan beberapa penjelasan tambahan yang dapat ditemukan di JSR:

  • @NotEmpty memvalidasi bahwa properti tersebut tidak null atau kosong; dapat diterapkan ke nilai String , Collection , Map atau Array .
  • @NotBlank hanya dapat diterapkan ke nilai teks dan memvalidasi bahwa properti tersebut bukan null atau spasi.
  • @Positive dan @PositiveOrZero berlaku untuk nilai numerik dan memvalidasi bahwa nilainya benar-benar positif, atau positif termasuk 0.
  • @Negative dan @NegativeOrZero berlaku untuk nilai numerik dan memvalidasi bahwa keduanya benar-benar negatif, atau negatif termasuk 0.
  • @Past dan @PastOrPresent memvalidasi bahwa nilai tanggal di masa lalu atau masa lalu termasuk masa kini; dapat diterapkan ke tipe tanggal termasuk yang ditambahkan di Java 8.
  • @Future dan @FutureOrPresent memvalidasi bahwa nilai tanggal berada di masa depan, atau di masa mendatang termasuk saat ini.

Anotasi validasi juga dapat diterapkan ke elemen koleksi :

List preferences;

Dalam hal ini, nilai apa pun yang ditambahkan ke daftar preferensi akan divalidasi.

Selain itu, spesifikasi mendukung tipe Opsional baru di Java 8:

private LocalDate dateOfBirth; public Optional getDateOfBirth() { return Optional.of(dateOfBirth); }

Di sini, kerangka validasi akan secara otomatis membuka nilai LocalDate dan memvalidasinya.

5. Validasi Programatis

Beberapa framework - seperti Spring - memiliki cara sederhana untuk memicu proses validasi hanya dengan menggunakan anotasi. Ini terutama agar kita tidak perlu berinteraksi dengan API validasi terprogram.

Sekarang mari kita pergi ke rute manual dan mengatur semuanya secara terprogram:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); 

Untuk memvalidasi kacang, pertama-tama kita memerlukan objek Validator , yang dibuat menggunakan ValidatorFactory .

5.1. Mendefinisikan Bean

Kami sekarang akan menyiapkan pengguna yang tidak valid ini - dengan nilai nama null :

User user = new User(); user.setWorking(true); user.setAboutMe("Its all about me!"); user.setAge(50); 

5.2. Validasi Bean

Sekarang kita memiliki Validator , kita dapat memvalidasi bean kita dengan meneruskannya ke metode validasi .

Setiap pelanggaran batasan yang didefinisikan dalam objek Pengguna akan dikembalikan sebagai Set :

Set
    
      violations = validator.validate(user); 
    

Dengan mengulangi pelanggaran, kita bisa mendapatkan semua pesan pelanggaran menggunakan metode getMessage :

for (ConstraintViolation violation : violations) { log.error(violation.getMessage()); } 

Dalam contoh kita ( ifNameIsNull_nameValidationFails ), set akan berisi ConstraintViolation tunggal dengan pesan "Nama tidak boleh null".

6. Kesimpulan

Artikel ini berfokus pada cara sederhana melalui Java Validation API standar. Kami menunjukkan dasar-dasar validasi kacang menggunakan anotasi javax.validation dan API.

Seperti biasa, implementasi konsep dalam artikel ini dan semua cuplikan kode dapat ditemukan di GitHub.