2016-08-17 35 views
1

我在使用Spring Boot和Kotlin來處理語言環境時遇到了一些麻煩。我在application.properties文件中創建這些設置:Spring Boot Controller的語言環境不能改變參數

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

然後在我的控制器中創建的MessageSource的自動裝配Autowired實例:

@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 
} 

有什麼建議?謝謝!

回答

1

好的,看起來像缺少的一塊是執行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) 
    } 
} 

我想我誤會了,以爲春天開機就可以自己處理的LocaleChangeInterceptor如果您創建正確的豆,但我猜你仍然覆蓋一個WebMvcConfigurerAdapter並強制攔截在那裏。如果我錯過了某些東西,並且有人有更清晰的解決方案,我很樂意爲您提供接受的答案,因爲我在這裏所做的只是感覺像一個混亂的解決方法。