我在将Spring Boot与Kotlin一起使用来处理语言环境时遇到一些麻烦。我在application.properties文件中创建了以下设置:
spring.messages.basename=messages/messages
spring.messages.cache-seconds=-1
spring.messages.encoding=UTF-8
然后在我的 Controller 中创建MessageSource的 Autowiring 实例:
@Autowired
lateinit var messageSource: MessageSource
当将语言环境作为参数放置在url中时,当我调用
LocaleContextHolder.getLocale()
时,该参数似乎没有被拾取,因此它始终是en_US。不过,我可以使用@RequestParam(value="locale") locale: Locale
作为 Controller 函数的参数来手动拾取它,然后从那里在 Controller 函数中使用它,但不能在其他函数中使用它。我认为 Spring 启动LocaleContextHolder应该在整个 session 中根据请求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
}
除了手动捕获区域设置并将其作为 Controller 调用的每个函数的参数之外,还有什么建议可以尝试?谢谢!
最佳答案
好的,看起来缺少的部分是实现WebMvcConfigurerAdapter
,设置SessionLocaleResolver
bean和重写addInterceptors
函数以手动添加我的LocaleChangeInterceptor
。我使用了一个单独的Configuration类来执行此操作。
@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
并在其中强制使用拦截器。如果我错过了某件事,并且有人提供了更干净的解决方案,我很乐意为您提供可接受的答案,因为我在这里所做的一切感觉就像是一个混乱的解决方法。
关于spring - Spring Boot Controller区域设置不随参数更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39006818/