Spring Boot Controller语言环境不随参数更改

我在使用Kotlin的Spring Boot来处理区域设置时遇到了一些麻烦。 我在我的application.properties文件中创建了这些设置:

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

然后在我的控制器中创建一个MessageSource的自动装配实例:

 @Autowired lateinit var messageSource: MessageSource 

当把url中的语言环境作为参数时,当我调用LocaleContextHolder.getLocale()时,这个参数似乎没有被拾取,所以它总是en_US。 虽然,我可以使用@RequestParam(value="locale") locale: Locale作为我的控制器函数的一个参数手动提取,并在控制器函数中使用它,但不能在其他函数中使用它。 我认为,春季启动LocaleContextHolder应该保持当前的区域设置基于请求的URL自动为整个会话。

我读了一篇较老的文章,提到在主类中使用LocaleChangeInterceptor bean以及MessageSource和LocaleResolver的bean,但另一篇文章则说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 } 

任何关于下一步尝试的建议,除了手动捕获语言环境并使其成为每个由控制器调用的函数中的参数? 谢谢!

好吧,看起来像缺少一块实施WebMvcConfigurerAdapter ,设置一个SessionLocaleResolver bean,并重写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) } } 

我想我误解了,认为如果你创建了合适的bean,Spring Boot自己处理了LocaleChangeInterceptor ,但是我想你还是要重写一个WebMvcConfigurerAdapter并在那里强制拦截器。 如果我错过了一些东西,而且有人有一个更清洁的解决方案,我会很高兴给你接受的答案,因为我在这里做的只是感觉像一个混乱的解决方法。