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

Spring String与Map注入异常:Map被误注入String Bean值问题排查

Spring依赖注入异常:Map<String, String> Bean注入错误的原因分析

问题场景

定义的配置Bean如下:

@Configuration
public class ConfigurationBean {

    @Bean
    public Config getConfig() {
        return ConfigFactory.load();
    }

    @Bean
    public Map<String, String> tableMap(Config config) {
        return config.getObject("tables").unwrapped().entrySet().stream()
                .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().toString()));
    }

    @Bean
    public String url(Config config) {
        return config.getString("url");
    }
}

服务类代码:

@Component
public class TableService  {
    private final Map<String, String> tableMap;
    private final String url;
    private Connection connection;
    private final TableToJsonConverter tableToJsonConverter;

    @Autowired
    public TableService(TableToJsonConverter tableToJsonConverter,
                        String url,
                        Map<String, String> tableMap) {
        this.url = url;
        this.tableMap = tableMap;
        this.tableToJsonConverter = tableToJsonConverter;
    }
}

预期tableMap注入{newGame:new_game_table, oldGame:old_game_table},但实际注入的是{url:www.google.com},而url注入正常。

问题原因

Spring的自动注入规则中,当注入Map<String, T>类型的依赖时:

  • 如果泛型的T是具体类(比如这里的String),Spring会自动收集所有类型为T的Bean,以Bean的名称作为key,Bean实例作为value,组成一个Map注入。
  • 你定义的tableMap是Map<String, String>类型的Bean,但构造方法中的Map<String, String> tableMap参数没有明确指定要注入这个Bean,Spring会优先触发“收集同类型Bean”的规则,把唯一的String类型Bean(url)收集成Map注入,而非你的自定义Map Bean。

解决方法

在构造方法的tableMap参数上添加@Qualifier("tableMap")注解,明确指定要注入的Bean名称,让Spring定位到你定义的自定义Map Bean:

@Autowired
public TableService(TableToJsonConverter tableToJsonConverter,
                    String url,
                    @Qualifier("tableMap") Map<String, String> tableMap) {
    this.url = url;
    this.tableMap = tableMap;
    this.tableToJsonConverter = tableToJsonConverter;
}

默认情况下@Bean的名称就是方法名tableMap,所以上述写法可直接生效;如果后续修改了Bean名称,同步调整@Qualifier的参数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:41:33