Trong bài viết tìm hiểu về annotation @Entity and @Table trong JPA, mình đã đề cập với các bạn khái niệm về Java Bean, chúng là những POJO với ít nhất một constructor không có tham số. Chúng ta thường sử dụng Java Bean để chứa thông tin của một đối tượng nào đó. Để đảm bảo rằng thông tin của đối tượng chứa trong Java Bean phù hợp với nhu cầu của chúng ta, Java giới thiệu spec Java Bean Validation giúp chúng ta có thể validate thông tin của đối tượng một cách dễ dàng. Cụ thể như thế nào? Chúng ta sẽ cùng nhau tìm hiểu về Bean Validation trong Java trong bài viết này các bạn nhé!
Đầu tiên, mình sẽ tạo mới một Maven project để làm ví dụ:
Để làm việc với Bean Validation, các bạn cần khai báo thư viện implement spec này Hibernate Validator:
1 2 3 4 5 |
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.1.0.Alpha5</version> </dependency> |
Các bạn sẽ thấy thư viện API định nghĩa spec cũng được include vào trong phần Maven Dependencies của project.
Nếu các bạn làm việc với các ứng dụng desktop J2SE thì cần khai báo thêm một dependency nữa là Unified Expression Language (EL) như sau:
1 2 3 4 5 |
<dependency> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> <version>3.0.1-b11</version> </dependency> |
Thư viện này dùng để evaluate expression trong message lỗi nếu chúng ta có sử dụng.
Bây giờ mình có một class Student như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package com.huongdanjava.beanvalidation; public class Student { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } |
Giả sử bây giờ mình cần lưu trữ thông tin của các sinh viên với class Student này, với điều kiện là tên sinh viên không được null và tuổi của sinh viên không được nhỏ hơn 18.
Để thoả mãn điều kiện trên, mình sẽ sử dụng Bean Validation để định nghĩa ràng buộc khi người dùng muốn thêm mới một sinh viên như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
package com.huongdanjava.beanvalidation; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; public class Student { @NotNull(message = "Name cannot be null") private String name; @Min(value = 18, message = "Age should not be less than 18") private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } |
Như các bạn thấy, ở đây mình dùng 2 annotation của Bean Validation là @NotNull và @Min để định nghĩa ràng buộc cho tất cả các thông tin của sinh viên. Thuộc tính message trong 2 annotation này dùng để hiển thị cho người dùng biết là giá trị của field nào không đúng yêu cầu.
Các bạn có thể tìm thấy nhiều annotation khác trong trang spec của Bean Validation, ở đây mình chỉ lấy 2 annotation này để làm ví dụ.
Bây giờ mình sẽ viết một ví dụ để xem cụ thể việc validation sẽ xảy ra như thế nào các bạn nhé.
Đầu tiên, mình cần tạo mới đối tượng ValidatorFactory để lấy đối tượng Validator từ đó như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package com.huongdanjava.beanvalidation; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; public class Application { public static void main(String[] args) { ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); } } |
Giả sử mình có một sinh viên với thông tin như sau:
1 2 3 |
Student student = new Student(); student.setName("Khanh"); student.setAge(12); |
Khi đó, sử dụng phương thức validate() của đối tượng Validator:
1 2 3 4 |
Set<ConstraintViolation<Student>> violations = validator.validate(student, Student.class); for (ConstraintViolation<Student> violation : violations) { System.err.println(violation.getMessage()); } |
các bạn sẽ thấy kết quả như sau:
Vì age mình chỉ set giá trị 12 nên field này đang không đúng yêu cầu đó các bạn.