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

