2016-08-17 3 views
1

ロットを処理するためにKotlinでSpringブートを使用する際に問題があります。パラメータdoesnの、パラメータとしてURLにロケールを置くときパラメータで春ブートコントローラのロケールが変更されない

@Autowired 
lateinit var messageSource: MessageSource 

:私のコントローラ内のMessageSourceのautowiredインスタンスを作成した後

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

:私は私のapplication.propertiesファイルでこれらの設定を作成しました私が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を設定し、手動で私のLocaleChangeInterceptorを追加するaddInterceptors関数をオーバーライドたようにOK、見えます。私はこれを行うために別の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を作成した場合は春ブーツがそれ自身にLocaleChangeInterceptorを取り扱うことを考えて、誤解を推測するが、私はあなたがまだWebMvcConfigurerAdapterをオーバーライドして、そこに迎撃を強制的に持っていると思います。私が何かを見逃していて、誰かがより洗練された解決策を持っているなら、私がここでやっていることは面倒な回避策のように感じるので、受け入れられた答えをお寄せいただきたいと思います。

関連する問題