Cách đọc một List object từ YAML trong Spring Boot

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

https://www.baeldung.com/spring-boot-yaml-list

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x