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

Spring中如何从Properties文件注入值为List的Map?

问题:Spring中从Properties注入Map<String, List>类型配置的正确语法

我在.properties文件中有如下配置:

my.config=key:value1,value2,value3

希望在Java代码中通过@Value注解读取为Map<String, List<String>>类型:

@Value("${my.config}")
private Map<String, List<String>> availableProductsForJurisdiction;

期望变量值为{'key': ['value1', 'value2', 'value3']},但运行时报错,请问正确的配置语法是什么?


解决方案

直接用默认的@Value解析原格式无法得到目标类型,需要调整配置格式并配合Spring的语法来实现,以下是两种可行方案:

方案一:用@ConfigurationProperties绑定(推荐)

这是Spring官方推荐的复杂类型配置绑定方式,更清晰易维护。

  1. 修改Properties配置
    改成层级式的配置结构:

    my.config.key[0]=value1
    my.config.key[1]=value2
    my.config.key[2]=value3
    

    或者更紧凑的格式:

    my.config.key=value1,value2,value3
    
  2. Java代码调整
    在组件类(比如标注@Component或@Configuration的类)中使用@ConfigurationProperties替代@Value:

    @Component
    @ConfigurationProperties(prefix = "my.config")
    public class YourConfigClass {
        private Map<String, List<String>> availableProductsForJurisdiction;
    
        // 需提供getter和setter方法
        public Map<String, List<String>> getAvailableProductsForJurisdiction() {
            return availableProductsForJurisdiction;
        }
    
        public void setAvailableProductsForJurisdiction(Map<String, List<String>> availableProductsForJurisdiction) {
            this.availableProductsForJurisdiction = availableProductsForJurisdiction;
        }
    }
    

    注意:需要确保项目启用配置属性绑定,比如在启动类上添加@EnableConfigurationProperties,或者直接在配置类上用@ConfigurationProperties配合@Component。

方案二:用@Value配合SpEL解析

如果一定要用@Value,需要通过SpEL(Spring表达式语言)触发复杂类型解析。

  1. 修改Properties配置
    写成符合SpEL映射语法的格式:

    my.config={key: ['value1', 'value2', 'value3']}
    
  2. Java代码调整
    在@Value中用#{...}包裹配置键,让Spring用SpEL解析:

    @Value("#{${my.config}}")
    private Map<String, List<String>> availableProductsForJurisdiction;
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:07:26