Bộ sưu tập

Giới thiệu về Java Bean Validation


https://codersontrang.com/2014/04/05/gioi-thieu-ve-java-bean-validation/

Java Bean Validation là một chuẩn bao gồm các quy tắc và APIs phục cho việc xác minh tính đúng đắn của dữ liệu trong các đối tượng của Java (Java Bean). Dữ liệu mà nói ở trên có thể là giá trị của một thuộc tính, hay giá trị trả về hay tham số của một phương thức trong đối tượng đó. Bean Validation trước hết cho phép người sử dụng chỉ ra các quy tắc ràng buộc về tính đúng đắn của dữ liệu định nghĩa trong các lớp, sau đó sẽ cung cấp cho người sử dụng các APIs để xác minh lại sự đúng đắn của dữ liệu trong từng đối tượng của lớp trong quá trình runtime. Ở bên trên ta có nói Java Bean Validation chỉ là một chuẩn có nghĩa là nó chỉ nêu ra những cách thức chung nhất để phục vụ cho việc xác minh tính đúng đắn của dữ liệu mà thôi, còn lại khi sử dụng ta phải có một cài đặt cụ thể cho chuẩn này. Có một số các cài đặt theo chuẩn Java Bean Validation mà ta có thể kể tên ở đây như là Hibernate Validator hay Apache Bean Validation.

Bài viết này sẽ giới thiệu với bạn đọc về Java Bean Validation cũng như điểm qua một số cách thức để xác minh tính đúng đắn của dữ liệu qua việc sử dụng nó trong một ví dụ cụ thể. Ví dụ của bài viết sẽ sử dụng cài đặt là Hibernate Validator mà ta nói ở trên.

Tạo một Project trên Eclipse IDE như hình dưới đây:

codersontrang_beanvalidation_1

Như đã nói ở trên, Java Bean Validation sẽ cung cấp các cách thức (dùng annotation hoặc file cấu hình xml) để định nghĩa ra các ràng buộc về tính đúng đắn của dữ liệu trong một đối tượng của một lớp. Trong ví dụ của chúng ta, ta có một lớp Student và mọi ràng buộc cho các thuộc tính trong bản thân lớp này sẽ được khai báo thông qua các annotation như dưới đây:

Student.java

 package validation.beans;  

 import java.util.Date;  

 import javax.validation.constraints.Min;  
 import javax.validation.constraints.NotNull;  
 import javax.validation.constraints.Past;  
 import javax.validation.constraints.Pattern;  
 import javax.validation.constraints.Size;  

 public class Student {  
      @NotNull(message="Name is not null")  
      @Size(min=3, max=20, message="Name length must be b/w 3 and 20")  
      private String name;  

      @Min(value=18, message="Age must be over 18")  
      private int age;  

      @Pattern(regexp="^[0-9]{10,11}$", message="Phone must be sequence of 10-11 digits")  
      private String phone;  

      @Past(message="The first day in school must be in the past")  
      private Date firstDayInSchool;   

      public Student(String name, int age, String phone, Date firstDayInSchool){  
           this.name = name;  
           this.age = age;  
           this.phone = phone;  
           this.firstDayInSchool = firstDayInSchool;  
      }  
 }  

Nhìn vào trên ta thấy bản thân Java Bean Valdiation cung cấp cho chúng ta khá nhiều các annotation để tạo nên các ràng buộc. Cụ thể trong lớp Student có 4 trường là name, age, phonefirstDayInSchool. Với việc định nghĩa như trên, @NotNull, @Size quy định trường name sẽ có ràng buộc là không được null, và sẽ là xâu kí tự có độ dài từ 3 đến 20. @Min quy định trường age sẽ không thể có giá trị nhỏ hơn 18. Trường phone sẽ có giá trị phải khớp với biểu thức quy tắc được định nghĩa trong annotation @Pattern tức là nó sẽ là một xâu với các kí tự là các chữ số và có độ dài là 10 hoặc 11. @Past quy định trường firstDayInSchool sẽ có giá trị kiểu Date và sẽ phải là một ngày ở trong quá khứ. Trong mỗi annotation ta có sử dụng thuộc tính message để chỉ ra lời nhắn khi mà một trong các ràng buộc về mặt dữ liệu tương ứng bị vi phạm. Còn rất nhiều các annation khác mà bản thân Java Bean Validation cung cấp, ngoài ra, chúng ta cũng có thể tự định nghĩa ra một annotation của riêng mình cùng với việc định nghĩa ra một quy tắc ràng buộc về mặt dữ liệu tương ứng.

Lớp FieldValidationMain.java chứa phương thức main(), là điểm bắt đầu của chương trình, chứa đoạn mã minh họa cho cách thức xác minh tính đúng đắn về dữ liệu trong các đối tượng có kiểu Student, dựa vào các ràng buộc được định nghĩa ở bên trên như sau:

FieldValidationMain.java

 package validation.mains;  

 import java.text.ParseException;  
 import java.text.SimpleDateFormat;  
 import java.util.Set;  

 import javax.validation.Configuration;  
 import javax.validation.ConstraintViolation;  
 import javax.validation.Validation;  
 import javax.validation.Validator;  
 import javax.validation.ValidatorFactory;  

 import validation.beans.Student;  

 public class FieldValidationMain {  
      public static void main(String [] args) throws ParseException{  
           Configuration<?> config = Validation.byDefaultProvider().configure();  
           ValidatorFactory factory = config.buildValidatorFactory();  
           Validator validator = factory.getValidator();  

           SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd");

           System.out.print("Validate student 1 info : ");  
           Student student1 = new Student("A", 15, "012345", formater.parse("2100-04-05"));  
           displayViolationsIfAny(validator.validate(student1));  

           System.out.print("\nValidate student 2 info : ");  
           Student student2 = new Student("ABC", 18, "0123456789", formater.parse("2014-01-01"));  
           displayViolationsIfAny(validator.validate(student2));  
      }  

      public static <T> void displayViolationsIfAny(Set<ConstraintViolation<T>> violations){  
           if(violations.isEmpty()){  
                System.out.println("Student information is valid");  
                return;  
           }  
           System.out.println("Student information is invalid");  
           for(ConstraintViolation<T> violation : violations){  
                System.out.println(" --- "+violation.getMessage());  
           }  
      }  
 }  

Đầu tiên để có thể thực hiện việc xác minh, ta cần phải tạo ra một đối tượng validator thuộc kiểu javax.validation.Validator. Từ đối tượng này có thể gọi phương thức validate() để kiểm tra các ràng buộc trên một đối tượng cụ thể. Phương thức validate() sẽ trả về một tập hợp các đối tượng thuộc kiểu ConstraintViolation. Nếu tập hợp này là tập hợp rỗng thì có nghĩa là dữ liệu của đối tượng hoàn toàn đúng đắn tuân theo các ràng buộc đã được định nghĩa. Còn lại tập hợp sẽ là tổng hợp của tất cả các ràng buộc đã bị vi phạm. Từ một đối tượng thuộc kiểu ConstraintViolation trong tập hợp này, ta có thể lấy ra lời nhắn báo cáo sự vi phạm tương ứng đã được định nghĩa ở bên trên bằng cách gọi phương thức getMessage().

Trong ví dụ, ta tạo ra hai đối tượng thuộc kiểu Studentstudent1student2. Đối tượng student1 sẽ mang các thông tin vi phạm tất cả các ràng buộc được định nghĩa trong lớp Student, còn student2 sẽ là hợp lệ. Ta sẽ thấy được điều này qua việc chạy chương trình, kết quả sẽ như hình dưới đây:

codersontrang_beanvalidation_2

Java Bean Validation là một chuẩn đưa ra các cách thức để định nghĩa ràng buộc và xác minh sự hợp lệ của dữ liệu trong các đối tượng Java. Với các ràng buộc được định nghĩa trước và với các cài đặt sẵn có như Hibernate Validator, công việc của người lập trình viên sẽ được tiết kiệm khá nhiều khi mà không phải tự làm bằng tay tất cả việc kiểm tra tính đúng đắn của dữ liệu. Thêm vào đó, sử dụng Java Bean Validation ta còn có thể phân tách các logic liên quan đến kiểm tra sự hợp lệ về dữ liệu ra một thành phần riêng biệt. Nó phù hợp với quy tắc “Separation of Concern” trong thiết kế phần mềm. Chúng ta sẽ còn có nhiều các bài viết khác để tìm hiểu sâu hơn về Java Bean Validation.

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google photo

Bạn đang bình luận bằng tài khoản Google Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s