使用Apache Commons Configuration2读取YAML对象列表问题求助
问题解决指南
1. 排查verificated-emails返回null的原因及修复
核心问题
直接调用getProperty无法正确识别YAML中的列表结构,且未妥善处理流资源,可能导致文件加载异常。
修复后的完整代码
public List<VerificatedEmailsConfiguration> loadVerificatedEmailsConfiguration() throws ConfigurationException, IOException, org.apache.commons.configuration2.ex.ConfigurationException { log.info("start loadVerificatedEmailsConfiguration"); YAMLConfiguration yamlConfiguration = new YAMLConfiguration(); if(VERIFICATED_EMAIL_CONFIG == null) { throw new ConfigurationException("FilePath is null"); } List<VerificatedEmailsConfiguration> verificatedEmailsConfigurationList = new ArrayList<>(); // 用try-with-resources自动关闭输入流,避免资源泄漏 try (InputStream inputStream = new FileInputStream(VERIFICATED_EMAIL_CONFIG)) { yamlConfiguration.read(inputStream); // 直接获取列表类型的节点,指定元素为Map(对应YAML中的每个对象) List<Map<String, Object>> emailMaps = yamlConfiguration.getList(Map.class, "verificated-emails"); log.info("verifyEmails: {}", emailMaps); // 将每个Map转换为实体类对象,自动处理可选属性 for (Map<String, Object> emailMap : emailMaps) { VerificatedEmailsConfiguration config = new VerificatedEmailsConfiguration(); config.setEmail((String) emailMap.get("email")); config.setFirstname((String) emailMap.get("firstname")); // 可选属性不存在时返回null,不影响实体类 config.setSurname((String) emailMap.get("surname")); verificatedEmailsConfigurationList.add(config); } } return verificatedEmailsConfigurationList; }
2. 关键细节说明
- 流资源管理:使用
try-with-resources包裹输入流,确保文件读取完成后自动释放资源。 - 列表读取方式:通过
getList(Map.class, "verificated-emails")直接识别YAML中的列表结构,解决原代码getProperty返回null的问题。 - 可选属性兼容:实体类的可选属性(如
firstname)在Map中不存在时会返回null,@Data注解生成的setter方法可直接处理null值,无需额外判断。
3. 验证注意事项
- 确认
VERIFICATED_EMAIL_CONFIG指向的文件路径绝对正确,且程序拥有该文件的读取权限。 - 检查YAML文件格式:确保
verificated-emails下的每个元素语法合法(示例中的短格式对象写法是合规的)。
内容的提问来源于stack exchange,提问作者Milousel
相关产品推荐
相关产品推荐

