【问题标题】:Not able to access Message Source in Spring Boot 2.1.1.RELEASE在 Spring Boot 2.1.1.RELEASE 中无法访问消息源
【发布时间】:2025-12-09 17:40:01
【问题描述】:

我正在使用 Spring Boot 2.1.1.RELEASE,其中我无法访问配置的消息源。

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/> 
 </parent>

@SpringBootApplication
public class RestfulWebservicesApplication {

    //......... some code

    //......... some code
@Bean
public LocaleResolver localeResolver() {
    SessionLocaleResolver resolver = new SessionLocaleResolver();
    resolver.setDefaultLocale(Locale.US);
    return resolver;
}

 @Bean
 public MessageSource resourceBundleMessageSource() {
    ResourceBundleMessageSource resourceBundleMessageSource = new ResourceBundleMessageSource ();
    resourceBundleMessageSource.setBasename("classpath:messages");
    return resourceBundleMessageSource;
}

Above approach is from another SO question

下面是我的restcontroller类方法:

@GetMapping("/hello-world-I18N")
public String helloWorldI18N(@RequestHeader(name="Accept-Language",required = false) Locale locale) {
    return messageSource.getMessage("good.morning.message",null,locale);
}

从 POSTMAN 获取请求:

在调试日志中自动配置不匹配。

MessageSourceAutoConfiguration: 不匹配: - ResourceBundle 没有找到带有基本名称消息的捆绑包 (MessageSourceAutoConfiguration.ResourceBundleCondition)

我确实尝试过在配置中检测到的另一种方式,但错误与突出显示的相同。

 @Bean
 public MessageSource resourceBundleMessageSource() {
    ReloadableResourceBundleMessageSource resourceBundleMessageSource = new ReloadableResourceBundleMessageSource ();
    resourceBundleMessageSource.setBasename("messages");
    return resourceBundleMessageSource;
}

MessageSourceAutoConfiguration:
  Did not match:
     - @ConditionalOnMissingBean (types: org.springframework.context.MessageSource; SearchStrategy: current) found beans of type 'org.springframework.context.MessageSource' resourceBundleMessageSource (OnBeanCondition)
  Matched:
     - ResourceBundle found bundle URL [file:/C:/Users/gaura/IdeaProjects/restful-webservices/target/classes/messages.properties] (MessageSourceAutoConfiguration.ResourceBundleCondition)

messages.properties 的内容: good.morning.message=早安

这是否是当前 Spring Boot 2.1.1.RELEASE 的问题,就像 other version 一样???

【问题讨论】:

    标签: java spring spring-boot internationalization


    【解决方案1】:

    来自Spring docs

    加载 ApplicationContext 时,它会自动搜索上下文中定义的 MessageSource bean。 bean 的名称必须为 messageSource

    所以ApplicationContext 期望MessageSource bean 仅使用messageSource 名称定义。

    目前 Spring boot 的 MessageSourceAutoConfiguration 与此策略不一致:如果找到 MessageSource 类的 bean,它不会暴露 messageSource bean。

    所以你的问题的解决方案是:

    将方法名称更改为messageSource

    @Bean
    public MessageSource messageSource()
    

    或显式地为 bean 添加名称:

    @Bean("messageSource")
    public MessageSource resourceBundleMessageSource()
    

    Spring Boot 中的行为将在 2.2.x 中发生变化。如果MessageSourceAutoConfiguration 找不到messageSource bean 的名称而不是类,它将暴露MessageSource

    请参阅this 拉取请求。 (免责声明:我是 PR 的作者)

    【讨论】:

    • 不幸的是,我之前没有参考文档。谢谢这已经奏效了。