为什么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:将你自定义的
MessageSourceBean方法名修改为messageSource,会覆盖Spring Boot默认的同名Bean,无需添加@Qualifier即可注入自定义实例 - 方案2:将配置文件前缀从
message改为messages,删除自定义的MessageSourceBean,直接使用Spring Boot默认装配的实例 - 方案3:给自定义的
MessageSourceBean添加@Primary注解,按类型注入时会优先选择带@Primary的Bean,无需添加@Qualifier
内容的提问来源于stack exchange,提问作者Hatef Alipoor
相关产品推荐
相关产品推荐

