noprianto
noprianto
. 6 min read

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

comments powered by Disqus