You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将YAML中的键值对列表映射为Spring配置属性Map?

解决Spring Boot @ConfigurationProperties映射API密钥为Map的问题

问题原因

原YAML中application.security.api是列表结构,每个元素包含key和secret字段。直接用Map<String, String>接收时,Spring Boot会将列表索引作为前缀,把每个元素的属性拆分为0.key、0.secret这类键,最终得到4个条目而非预期的2个。

方案1:不修改YAML配置,通过中间实体转换

步骤1:定义单个API密钥的实体类

public record ApiKeyEntry(String key, String secret) {}

步骤2:修改ConfigurationProperties类接收列表

@ConfigurationProperties(prefix = "application.security")
public record ApiKeysConfig(List<ApiKeyEntry> api) {}

步骤3:创建Bean将列表转换为目标Map

@Configuration
@EnableConfigurationProperties(ApiKeysConfig.class)
public class ApiKeyConfiguration {
    @Bean
    public Map<String, String> apiKeys(ApiKeysConfig config) {
        return config.api().stream()
                .collect(Collectors.toMap(ApiKeyEntry::key, ApiKeyEntry::secret));
    }
}

之后可通过@Autowired Map<String, String> apiKeys注入预期的Map。

方案2:修改YAML为Map结构(更直接)

若允许调整配置文件结构,将原列表改为Map格式:

application:
  security:
    api:
      main-application: "127ab3a8-b496-42ae-8b7c-2433fa010f71"
      admin: "127ab3a8-b496-42ae-8b7c-2433fa010f72"

此时原有的ApiKeys记录类可直接使用:

@ConfigurationProperties(prefix = "application.security")
public record ApiKeys(Map<String, String> api) {}

映射后直接得到包含2个条目的目标Map。

内容的提问来源于stack exchange,提问作者Slevin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:58:38