Validasi Menggunakan Hibernate Validator
Bismillah,
Postingan kali ini masih berkaitan dengan hibernate, walaupun berbeda topiknya dari sebelumnya tentang bagaimana hibernate memberlakukan teknik penyimpanan data untuk disimpan dalam sebuah database. Tetapi pada pembahasan kali ini lebih untuk validasi sebelum data tersebut disimpan ke database, validasi sangat penting sekali dilakukan karena data yang tidak dilakukan validasi tentunya banyak menimbulkan data-data yang invalid bahkan missing. Efek dari data invalid dan missing adalah penggalian informasi yang terdapat pada data tersebut susah dilakukan, yang lebih fatal adalah informasi yang disajikan tidak akurat atau mengarah ke informasi yang salah.
Contohnya misalkan kita akan merekam data tentang buku, dimana buku memiliki attribut-attribut seperti judul, penulis, penerbit, tahun terbit, dan isbn. Misalkan tahun terbit akan kita batasi, hanya 10 tahun terakhir dan isbn juga sudah ada standarnya yaitu 13 digit. Hal-hal tersebut tidak perlu kita lakukan secara manual dengan membuat fungsi sendiri, tetapi dapat dilakukan menggunakan Hibernate Validator. Untuk mempermudah penulisan saya buat beberapa topik seperti di bawah ini
Kebutuhan Penggunaan
Beberapa hal yang disarankan untuk menjalankan contoh kode dengan baik adalah sebagai berikut
Sebenarnya editor-editor yang sering digunakan oleh programmer java seperi Netbeans, Intellij IDEA, dan Eclipse sudah include Apache Maven. Teruntuk Eclipse jika membutuhkan plugin yang tidak tersedia, bisa menambahkan plugin sendiri. Dengan adanya include di editor tidak perlu install tersendiri, tetapi jika menginginkan installasi sendiri tidak bermasalah. 🙂
Contoh Penggunaan
Sebagai contoh kita akan membuat sebuah entitas Buku seperti di bawah ini, tetapi silakan ditambahkan ke file pom.xm
depedensi yang dibutuhkan terlebih dahulu.
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.17.Final</version> </dependency> <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> <version>3.0.1-b09</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> <version>1.3</version> <scope>test</scope> </dependency>
Depedensi javax.el
dibutuhkan hibernate validator karena sebuah implementasi dari Unified Expression Language(JSR 341) untuk mengevaluasi ekspresi dinamik pada constraint violation message. Sedangkan junit
digunakan untuk unit testing pada kode yang telah kita buat.
public class Buku {
@Size(min = 6, max = 6)
private String kode;
@NotNull
private String judul;
@NotNull
private String penulis;
@NotNull
private String penerbit;
@Min(1970)
private int tahun_terbit;
@Size(min = 13, max = 13)
private String isbn;
public Buku() {
}
public Buku(String kode, String judul, String penulis, String penerbit, int tahun_terbit, String isbn) {
this.kode = kode;
this.judul = judul;
this.penulis = penulis;
this.penerbit = penerbit;
this.tahun_terbit = tahun_terbit;
this.isbn = isbn;
}
//Getter dan setter
Untuk melakukan validasi menggunakan hibernate validator yang dilakukan adalah dengan menambahkan anotasi, seperti yang dicontohkan adalah @NotNull, @Size, dan @Min
. @NotNull
digunakan untuk melakukan validasi bahwa attribut tersebut harus diset, @Size
untuk memberikan contraint ukuran dari sebuah field, dan @Min
untuk membatasi nilai dari sebuah field atau attribut. Kemudian tambahkan kode untuk melakukan unit test seperti di bawah ini
public class BukuTest {
private static Validator validator;
@Before
public void setUp() {
ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
validator = validatorFactory.getValidator();
}
@Test
public void testBuku() {
Buku buku = new Buku("00001", "Mencari Anak Di Negeri Arah", "Noprianto", "Andi Press", 1969, "1234567890123");
Set<ConstraintViolation<Buku>> validate = validator.validate(buku);
Iterator<ConstraintViolation<Buku>> iterator = validate.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().getMessage());
}
assertEquals(validate.size(),0);
}
}
Kemudian jika dijalankan hasil yang didapatkan adalah sebagai berikut
Jun 26, 2019 2:22:51 PM org.hibernate.validator.internal.util.Version INFO: HV000001: Hibernate Validator 6.0.17.Final must be greater than or equal to 1970 size must be between 6 and 6 java.lang.AssertionError: Expected :2 Actual :0
Ketika dijalankan unit test terjadi kegagalan atau java.lang.AssertionError
, penyebabnya karena tahun terbit adalah 1969, sedangkan contraintnya adalah minimal harus 1970 sehinga muncul pesan "must be greater than or equal to 1970"
. Kemudian untuk kode 00001
dengan panjang field minimal 6, sehingga mngakibatkan pesan "size must be between 6 and 6"
. Coba sekarang disesuaikan untuk attribut-attribut tersebut sehingga tidak memunculkan pesan-pesan di atas.
Custom Message
Pesan bawaan yang terjadi ketika contraint tidak terpenuhi dapat kita modifikasi sesuai dengan keinginan kita, hal yang dapat dilakukan adalah dengan menambahkan attribut pada property anotasi, dapat dicontohkan sebagai berikut
@Size(min = 6, max = 6,message = "Minimal panjang kode adalah 6 dan Maksimal adalah 6")
private String kode;
Custome message tetap harus dimasukkan ke dalam kode, bagaimana jika suatu saat kita ingin mengubahnya tanpa melakukan compile ulang program kita? Hal tersebut dapat dilakukan dengan menambahkan file properties.
Custome Message File Properties
Pesan yang ditampilkan dapat juga dioverride dan diletakkan pada sebuah file properties, yaitu dengan membuat file ValidationMessages.properties
. Ketika menggunakan maven dapat diletakkan di /src/main/resources. Dapat dicontohkan isi file ValidationMessages.properties
sebagai berikut
javax.validation.constraints.NotNull.message = Tidak boleh kosong
Untuk nama-nama properties yang lebih lengkap dapat Anda dapatkan di sini. Bagaimana mudah bukan menggunakan hibernate validator, sekarang kita tidak repot-repot lagi untuk menghabiskan waktu membuat fungsi untuk mengecek satu persatu data yang diinputkan oleh user. Kode lengkap dapat didapatkan di sini.
Demikianlah artikel saya mengenai hibernate validator, semoga bermanfaat dan tambah semangat coding java terlebih lagi menggunakan framework hibernate. Saran dan saran selalu saya butuhkan untuk meningkatkan kwalitas tulisan di blog ini. 🙂
Referensi
- https://hibernate.org/validator/documentation/getting-started/
- https://docs.jboss.org/hibernate/validator/5.2/reference/en-US/html/ch02.html#section-builtin-constraints
- https://www.baeldung.com/javax-validation
- https://howtodoinjava.com/hibernate/hibernate-validator-java-bean-validation/
- https://id.wikipedia.org/wiki/International_Standard_Book_Number
- https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Bean_Validation_Cheat_Sheet.md
- https://github.com/hibernate/hibernate-validator/blob/master/engine/src/main/resources/org/hibernate/validator/ValidationMessages.properties