Spring Boot中的YAML到对象列表

2025/03/22

1. 概述

在这个简短的教程中,我们将仔细研究如何将YAML列表映射到Spring Boot中的列表

我们将首先了解如何在YAML中定义列表的一些背景知识。

然后我们将深入研究如何将YAML列表绑定到对象列表。

2. 快速回顾YAML中的列表

简而言之,YAML是一种人类可读的数据序列化标准,它提供了一种简洁明了的方式来编写配置文件。YAML的优点在于它支持多种数据类型,例如List、Map和标量类型

YAML列表中的元素使用“-”字符定义,并且它们都具有相同的缩进级别:

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

作为比较,基于properties的等价物使用索引:

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

要了解更多示例,请随意查看我们的文章,了解如何使用YAML和属性文件定义List和Map

事实上,与properties文件相比,YAML的层次结构特性显著提高了可读性。YAML的另一个有趣的特性是可以为不同的Spring Profile定义不同的属性。从Boot 2.4.0版本开始,properties文件也可以这样做。

值得一提的是,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列表绑定到对象列表的逻辑:

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

    private List<Object> profiles;

    // getter and setter
}

ApplicationProps类需要用@ConfigurationProperties修饰,以表达将所有具有指定前缀的YAML属性映射到ApplicationProps对象的意图

要绑定配置文件列表,我们只需要定义一个List类型的字段,@ConfigurationProperties注解将处理其余部分。

请注意,我们使用@Component将ApplicationProps类注册为普通Spring Bean。因此,我们可以像任何其他Spring Bean一样将其注入到其他类中

最后,我们将ApplicationProps Bean注入到测试类中,并验证我们的配置文件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: support@yamllist.dev
            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映射到User对象列表中。

由于props条目的每个元素都包含不同的键,我们可以将其作为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。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章