如何将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
相关产品推荐
相关产品推荐

