Не удается получить доступ к источнику сообщений в Spring Boot 2.1.1.RELEASE - PullRequest
0 голосов
/ 29 декабря 2018

Я использую 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;
}

Вышеупомянутый подход взят из другого вопроса SO

Ниже приведен метод класса моего 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, как и у другой версии ??? * * тысяча сорок-одна

1 Ответ

0 голосов
/ 29 декабря 2018

С Spring docs :

Когда загружается ApplicationContext, он автоматически выполняет поиск bean-компонента MessageSource, определенного в контексте. Бин должен иметь имя messageSource .

Таким образом, ApplicationContext ожидает, что бин MessageSource определен только с именем messageSource.

В настоящее время загрузка Spring MessageSourceAutoConfiguration не соответствует этой политике: она не предоставляет бин messageSource, если обнаруживает бин с классом MessageSource.

Итак, решение вашей проблемы:

Либо измените имя метода на messageSource:

@Bean
public MessageSource messageSource()

Или добавьте имя к бину явно:

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

Поведение в Spring Boot изменится в 2.2.x.MessageSourceAutoConfiguration выставит MessageSource, если не найдет бин messageSource по имени, а не по классу.

См. этот запрос на получение.(отказ от ответственности: я автор PR)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...