在Spring Boot 2.1.1.RELEASE中无法访问消息源

时间:2018-12-29 10:42:12

标签: java spring spring-boot internationalization

我使用的是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>

Folder Structure

@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获取请求: enter image description here

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

  

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

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

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

Other Approach without message folder

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 ???

1 个答案:

答案 0 :(得分:3)

来自Spring docs

  

在加载ApplicationContext时,它将自动搜索在上下文中定义的MessageSource bean。 该bean必须具有名称messageSource

因此,ApplicationContext期望仅使用MessageSource名称定义的messageSource bean。

当前,Spring引导程序的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的作者)