2016-08-17 6 views
1

У меня возникли проблемы с использованием Spring Boot с Kotlin для обработки локали. Я создал эти настройки в моем application.properties файле:Язык загрузки контроллера загрузки не изменяется с параметром

spring.messages.basename=messages/messages 
spring.messages.cache-seconds=-1 
spring.messages.encoding=UTF-8 

Затем создал autowired экземпляр MessageSource в мой контроллер:

@Autowired 
lateinit var messageSource: MessageSource 

Когда поставить локаль в URL в качестве параметра, параметр Безразлично Кажется, меня забирают, когда я звоню LocaleContextHolder.getLocale(), поэтому он всегда en_US. Хотя, я могу вручную выбрать его, используя @RequestParam(value="locale") locale: Locale в качестве параметра для моей функции контроллера и использовать его оттуда в функции контроллера, но не в других функциях. Я думал, что весенняя загрузка LocaleContextHolder должна была поддерживать текущую локаль на основе URL-адреса запроса автоматически для всего сеанса.

Я прочитал более старую статью, в которой упоминается использование компонента LocaleChangeInterceptor, а также beans для MessageSource и LocaleResolver в вашем основном классе, но в другой статье сказано, что Spring Boot не требует этого. Я попробовал это в любом случае без разницы. Это функции, которые я использовал:

@Bean 
open fun localeResolver(): LocaleResolver { 
    val slr = SessionLocaleResolver() 
    slr.setDefaultLocale(Locale.US) 
    return slr 
} 

@Bean 
open fun localeChangeInterceptor(): LocaleChangeInterceptor { 
    val localeChangeInterceptor = LocaleChangeInterceptor() 
    localeChangeInterceptor.paramName = "locale" 
    return localeChangeInterceptor 
} 

@Bean 
open fun messageSource(): ResourceBundleMessageSource { 
    val source = ResourceBundleMessageSource() 
    source.setBasenames("messages/messages") 
    source.setDefaultEncoding("UTF-8") 
    return source 
} 

Любые предложения о том, что попробовать следующий кроме захвата локаль вручную и делает его параметров в каждой функции, которая вызывается контроллером? Благодаря!

ответ

1

ОК, похоже, отсутствует часть была реализацией WebMvcConfigurerAdapter, создания SessionLocaleResolver боба и переопределения функции addInterceptors вручную добавить мой LocaleChangeInterceptor. Для этого я использовал отдельный класс конфигурации.

@Configuration 
open class CustomWebMvcConfigurerAdapter : WebMvcConfigurerAdapter() { 

    //internationalization beans 
    @Bean 
    open fun localeResolver(): LocaleResolver { 
     val slr = SessionLocaleResolver() 
     slr.setDefaultLocale(Locale.US) 
     return slr 
    } 

    @Bean 
    open fun localeChangeInterceptor(): LocaleChangeInterceptor { 
     val localeChangeInterceptor = LocaleChangeInterceptor() 
     localeChangeInterceptor.paramName = "locale" 
     return localeChangeInterceptor 
    } 

    override fun addInterceptors(registry: InterceptorRegistry?) { 
     registry?.addInterceptor(localeChangeInterceptor()) 
     super.addInterceptors(registry) 
    } 
} 

Я предполагаю, что я не понял, думал, что весна Загрузочный обработал LocaleChangeInterceptor по себе, если вы создали правильный боб, но я думаю, вы должны еще переопределить WebMvcConfigurerAdapter и заставить перехватчик там. Если я что-то пропустил, а у кого-то было более чистое решение, я был бы рад дать вам принятый ответ, так как то, что я здесь делаю, просто похоже на беспорядочное обходное решение.

 Смежные вопросы

  • Нет связанных вопросов^_^