Mục lục
Trong bài viết ngắn này chúng ta sẽ cùng nhau tìm hiểu cách ánh xạ một danh sách được định nghĩa trong tệp cấu hình YAML sang List object trong Spring Boot.
Định nghĩa một List trong YAML
Spring Boot hiện nay đã hỗ trợ định dạng YAML để viết file cấu hình dự án ngoài định dạng properties. Để định nghĩa một danh sách các phần tử trong file YAML chúng ta có thể làm như sau:
yamlconfig: list: - item1 - item2 - item3 - item4
Các phần tử trong một List được bắt đầu bằng ký tự “-“, ngoài ra YAML còn hỗ trợ chúng ta định nghĩa các cấu trúc phức tạp khác như Map, Scaler type.
Để đạt được cấu hình tương tự như trên trong định dạng properties thì chúng ta phải làm như sau:
yamlconfig.list[0]=item1 yamlconfig.list[1]=item2 yamlconfig.list[2]=item3 yamlconfig.list[3]=item4
Ánh xạ List object từ YAML
Spring boot hỗ trợ @ConfigurationProperties annotation dùng để ánh xạ một list từ YAML vào object model rất dễ dàng. Giả sử chúng ta có file YAML có cấu hình sau
application: profiles: - dev - test - prod - 1 - 2
Sau đó, chúng ta có thể ánh xạ bằng cách định nghĩa ApplicationProps sử dụng @ConfigurationProperties để ánh xạ dữ liệu từ YAML sang.
@Component @Getter @Setter @ConfigurationProperties(prefix = "application") public class ApplicationProps { private List<String> profiles; }
Ở trên mình đã sử dụng @Component để đánh dấu ApplicationProps là một bean trong hệ thống, chúng ta có thể inject chúng ở bất cứ đâu mà chúng ta muốn sử dụng.
Giờ chúng ta có thể kiểm tra bằng một unit-test nhỏ như sau:
@SpringBootTest class YamlListConvertApplicationTests { @Autowired ApplicationProps props; @Test void testLoad() { for(String item: props.getProfiles()) { System.out.println("Profile: " + item); } } }
Output
Profile: dev Profile: test Profile: prod Profile: 1 Profile: 2
Ánh xạ một List complex object từ YAML
Trong trường hợp chúng ta định nghĩa một cấu trúc phức tạp trong file YAML mà không đơn thuần là một List String nữa thì chúng ta sẽ phải cần làm thêm một số công việc bắt buộc.
Giả sử file YAML của mình được định nghĩa thêm như sau
application: profiles: - dev - test - prod - 1 - 2 props: - name: YamlList url: http://yamllist.dev description: Mapping list in Yaml to list of objects in Spring Boot - ip: 10.10.10.10 port: 8091 - email: [email protected] contact: http://yamllist.dev/contact users: - username: admin password: admin@10@ roles: - READ - WRITE - VIEW - DELETE - username: guest password: guest@01 roles: - VIEW
Trong đó chúng ta có thể thấy props chứa nested object và users chứa một List các objet đại diện cho một User.
Đối với props không có quy luật cố định chúng ta có thể sử dụng Map để ánh xạ, còn với users thì chúng ta có thể định nghĩa một User class chứa các thuộc tính tương ứng trong YAML.
@Component @Getter @Setter @ConfigurationProperties(prefix = "application") public class ApplicationProps { private List<String> profiles; private List<Map<String, Object>> props; private List<User> users; @Getter @Setter public static class User { private String username; private String password; private List<String> roles; } }
Kiểm thử như sau:
@SpringBootTest class YamlListConvertApplicationTests { @Autowired ApplicationProps props; @Test void testLoad() { for(String item: props.getProfiles()) { System.out.println("Profile: " + item); } System.out.println("Name: " + props.getProps().get(0).get("name")); System.out.println("Port: " + props.getProps().get(1).get("port")); System.out.println("Username: " +props.getUsers().get(0).getUsername() ); } }
Output
Profile: dev Profile: test Profile: prod Profile: 1 Profile: 2 Name: YamlList Port: 8091 Username: admin
Tóm lược
Qua bài viết này chúng ta đã biết cách ánh xạ một List object từ YAML. Ngoài ra chúng ta cũng đã biết cách ánh xạ một list object có cấu trúc phức tạp.
Mã nguồn được mình public trên gitlab các bạn có thể tham khảo: YAML-LIST
Nguồn tham khảo