2016-08-17 86 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并强制拦截在那里。如果我错过了某些东西,并且有人有更清晰的解决方案,我很乐意为您提供接受的答案,因为我在这里所做的只是感觉像一个混乱的解决方法。