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

为什么RestController中@Autowired注入MessageSource不生效?

Spring国际化MessageSource注入异常原因分析

核心原因

你对当前应用上下文的Bean判断有误:应用中实际存在2个MessageSource类型的Bean,而非1个。
Spring Boot默认会自动装配一个名为messageSource的ResourceBundleMessageSource实例,默认规则为:

  • 读取basename为messages(末尾带s)的配置文件
  • 未配置useCodeAsDefaultMessage属性,找不到对应编码时直接抛出异常

你自定义的Bean名为resourceBundleMessageSource,配置的basename为message(末尾无s),属于第二个同类型Bean。

@Autowired未按预期工作的原因

@Autowired按类型注入时,如果存在多个同类型Bean,会自动将字段名作为Bean名称进行匹配:
你控制器中注入的字段名为messageSource,刚好匹配Spring Boot自动生成的默认MessageSource Bean,而这个默认Bean的basename和你实际创建的配置文件前缀不匹配,因此读取不到配置,抛出No message found under code异常。

添加@Qualifier后,Spring会强制按指定的Bean名称注入你自定义的实例,该实例配置和你的配置文件匹配,因此能正常返回结果。

可行解决方案

  • 方案1:将你自定义的MessageSource Bean方法名修改为messageSource,会覆盖Spring Boot默认的同名Bean,无需添加@Qualifier即可注入自定义实例
  • 方案2:将配置文件前缀从message改为messages,删除自定义的MessageSource Bean,直接使用Spring Boot默认装配的实例
  • 方案3:给自定义的MessageSource Bean添加@Primary注解,按类型注入时会优先选择带@Primary的Bean,无需添加@Qualifier

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 22:57:00