知識庫 / Spring / Spring Boot RSS 訂閱

Spring Boot 中 YAML 到對象列表轉換

Spring Boot
HongKong
4
12:50 PM · Dec 06 ,2025

1. 概述

本教程將深入探討如何將 YAML 列表映射到 Spring Boot 中的 List

我們將首先介紹如何在 YAML 中定義列表。

然後,我們將深入瞭解如何將 YAML 列表綁定到包含對象的 List

2. YAML 列表的簡要回顧

簡而言之,YAML 是一種可讀性強的元數據序列化標準,它提供了一種簡潔明瞭的方式來編寫配置文件。 YAML 的優點在於它支持多種數據類型,例如 列表映射 和標量類型。

YAML 列表中的元素使用 “-” 字符定義,並且它們都具有相同的縮進級別:

yamlconfig:
  list:
    - item1
    - item2
    - item3
    - item4

作為對比,基於屬性的等效方法使用索引:

yamlconfig.list[0]=item1
yamlconfig.list[1]=item2
yamlconfig.list[2]=item3
yamlconfig.list[3]=item4

要查看更多示例,請查看我們關於如何使用 YAML 和 屬性文件定義列表和映射的文章。

事實上, YAML 的層次結構比 屬性文件具有顯著的閲讀優勢。

YAML 的另一個有趣特性是能夠為不同的 Spring 配置文件定義不同的屬性。從 Boot 版本 2.4.0 開始,這同樣適用於 屬性文件。

值得一提的是,Spring Boot 提供 YAML 配置的即時支持。Spring Boot 在啓動時,默認從 application.yml 加載配置屬性,無需額外工作。

3. 將 YAML 列表綁定到簡單的對象列表

Spring Boot 提供 @ConfigurationProperties 註解,以簡化將外部配置數據映射到對象模型中的邏輯。

在本文中,我們將使用 @ConfigurationProperties 將 YAML 列表綁定到一個 `<List<Object>。

我們首先在 application.yml 中定義一個簡單的列表:

application:
  profiles:
    - dev
    - test
    - prod
    - 1
    - 2

然後,我們將創建一個簡單的 ApplicationProps POJO,用於存儲將我們的 YAML 列表綁定到 List 的對象列表的邏輯:

@Component
@ConfigurationProperties(prefix = "application")
public class ApplicationProps {

    private List<Object> profiles;
    
    // getter and setter

}

ApplicationProps 類需要使用 @ConfigurationProperties 裝飾,以表達將所有帶有指定前綴的 YAML 屬性映射到 ApplicationProps 對象的意圖。

要綁定 profiles 列表,只需定義一個類型為 List 的字段,@ConfigurationProperties 註解將負責其餘工作。

請注意,我們使用 @ComponentApplicationProps 類註冊為正常的 Spring Bean。作為結果,我們可以像任何其他 Spring Bean 一樣將其注入到其他類中。

最後,我們向測試類中注入 ApplicationProps Bean,並驗證我們的 profiles YAML 列表是否正確地注入為 List<Object>

@ExtendWith(SpringExtension.class)
@ContextConfiguration(initializers = ConfigDataApplicationContextInitializer.class)
@EnableConfigurationProperties(value = ApplicationProps.class)
class YamlSimpleListUnitTest {
 
    @Autowired
    private ApplicationProps applicationProps;
 
    @Test
    public void whenYamlList_thenLoadSimpleList() {
        assertThat(applicationProps.getProfiles().get(0)).isEqualTo("dev");
        assertThat(applicationProps.getProfiles().get(4).getClass()).isEqualTo(Integer.class);
        assertThat(applicationProps.getProfiles().size()).isEqualTo(5);
    }
}

4. 將 YAML 列表綁定到複雜列表

現在,讓我們更深入地瞭解如何將嵌套的 YAML 列表注入到複雜的結構化 List 中。

首先,讓我們為 application.yml 添加一些嵌套列表:

application:
  // ...
  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

在本示例中,我們將 props 屬性綁定到一個 List<Map<String, Object>> 對象。 此外,我們將 users 映射到一個 List 對象,該對象包含 User 對象。

由於每個 props 條目的元素都包含不同的鍵,我們可以將其注入為一個 List 對象,該對象包含 Map 對象。 請查看我們在 Spring Boot 中如何從 YAML 文件中注入 Map 的文章.

但是, 對於 users 而言,所有項目共享相同的鍵,因此為了簡化映射過程,我們可能需要創建一個專門的 User 類來封裝鍵作為字段

public class ApplicationProps {
    
    // ...
	
    private List<Map<String, Object>> props;
    private List<User> users;
    
    // getters and setters

    public static class User {

        private String username;
        private String password;
        private List<String> roles;

        // getters and setters

    }
}

現在我們驗證嵌套的 YAML 列表是否正確映射。

@ExtendWith(SpringExtension.class)
@ContextConfiguration(initializers = ConfigDataApplicationContextInitializer.class)
@EnableConfigurationProperties(value = ApplicationProps.class)
class YamlComplexListsUnitTest {
 
    @Autowired
    private ApplicationProps applicationProps;
 
    @Test
    public void whenYamlNestedLists_thenLoadComplexLists() {
        assertThat(applicationProps.getUsers().get(0).getPassword()).isEqualTo("admin@10@");
        assertThat(applicationProps.getProps().get(0).get("name")).isEqualTo("YamlList");
        assertThat(applicationProps.getProps().get(1).get("port").getClass()).isEqualTo(Integer.class);
    }
	
}

5. 結論

在本文中,我們學習瞭如何將 YAML 列表映射到 Java 中的 List 對象中。

我們還檢查瞭如何將複雜的列表綁定到自定義 POJO 中。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.