引言

在现代软件开发中,配置文件的使用非常普遍,尤其是在微服务架构中,外部配置文件可以让开发者更灵活地管理应用程序的配置。YAML(YAML Ain’t Markup Language)由于其易读性和结构化特性,成为了许多开发者的首选配置文件格式。然而,当我们需要从YAML文件中读取复杂的对象列表时,解析和映射这些对象可能并不简单。本文将通过一个实例,探讨如何使用Apache Commons Configuration2库来解析YAML文件,并将数据映射到Java对象中。

问题背景

假设我们有一个YAML文件,包含了一个verificated-emails列表,每个列表项是一个包含emailfirstnamesurname属性的对象。以下是一个示例YAML文件内容:

verificated-emails:
  - { email: [email protected], firstname: Dummy, surname: xxxx }
  - { email: [email protected], firstname: Bob, surname: xxx }
  - { email: [email protected], surname: Dusan }
  - { email: [email protected], firstname: tomas, surname: xxx }

我们需要在每次调用loadVerificatedEmailsConfiguration方法时读取并解析这个YAML文件,并将数据转换为VerificatedEmailsConfiguration对象列表。

解决方案

1. 准备工作

首先,我们需要定义一个VerificatedEmailsConfiguration类来存储每个邮件配置:

@Data
public class VerificatedEmailsConfiguration {
    private String email;
    private String firstname;
    private String surname;
}

2. 使用Apache Commons Configuration2

我们将使用configurationsAt方法来获取YAML文件中verificated-emails的配置列表,并将其映射到我们定义的对象中。

public List<VerificatedEmailsConfiguration> loadVerificatedEmailsConfiguration() throws ConfigurationException, IOException {
    YAMLConfiguration yamlConfiguration = new YAMLConfiguration();
    List<VerificatedEmailsConfiguration> verificatedEmailsConfigurationList = new ArrayList<>();
    InputStream inputStream = new FileInputStream(VERIFICATED_EMAIL_CONFIG);
    yamlConfiguration.read(inputStream);
    
    // 获取verificated-emails的配置列表
    final List<HierarchicalConfiguration<ImmutableNode>> verifiedEmails = yamlConfiguration.configurationsAt("verificated-emails");
    for(var entry : verifiedEmails) {
        VerificatedEmailsConfiguration configuration = new VerificatedEmailsConfiguration();
        configuration.email = entry.getString("email");
        configuration.firstname = entry.getString("firstname");
        configuration.surname = entry.getString("surname");
        verificatedEmailsConfigurationList.add(configuration);
    }
    return verificatedEmailsConfigurationList;
}

3. 处理可选属性

在上述代码中,我们注意到有些对象可能不包含所有的属性(例如第三个对象没有firstname)。Apache Commons Configuration2的getString方法会返回null如果属性不存在,这恰好满足了我们的需求。

实践与结果

运行上述代码后,我们可以看到verificatedEmailsConfigurationList被成功填充:

List<VerificatedEmailsConfiguration> result = loadVerificatedEmailsConfiguration();
for (VerificatedEmailsConfiguration config : result) {
    System.out.println(config);
}

输出将显示每个对象的属性,其中缺失的属性会为null

VerificatedEmailsConfiguration(email=[email protected], firstname=Dummy, surname=xxxx)
VerificatedEmailsConfiguration(email=[email protected], firstname=Bob, surname=xxx)
VerificatedEmailsConfiguration(email=[email protected], firstname=null, surname=Dusan)
VerificatedEmailsConfiguration(email=[email protected], firstname=tomas, surname=xxx)

结论

通过使用Apache Commons Configuration2库,我们可以轻松地从YAML文件中读取并映射复杂的对象列表。该方法不仅能够处理必需属性,还能优雅地处理可选属性,为配置文件的解析提供了一个强大而灵活的解决方案。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐