spring - Spring Boot Controller区域设置不随参数更改

标签 spring spring-boot internationalization locale kotlin

我在将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/

相关文章:

java - 如何从主类之外访问 Spring bean

java - .persist() 在新线程的 Spring Roo 中不起作用

java - Http 标签的 Spring 安全问题

java - Hibernate中字符串类型的外键

java - 如何扫描用户输入以确认执行 DELETE 操作

unit-testing - Apache Camel bean 单元测试

java - 如何在未运行的情况下检查从 ResourceBundle 调用的字符串是否存在?

java - 链式事务 api 调用 spring

java - GWT 中的动态属性

rust - 使用 Project Fluent 的 Rust 实现匹配 None 和缺失值