2012-08-01 14 views
9
import java.util.Locale; 

import org.springframework.context.MessageSource; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.support.ReloadableResourceBundleMessageSource; 
import org.springframework.web.servlet.HandlerMapping; 
import org.springframework.web.servlet.LocaleResolver; 
import org.springframework.web.servlet.i18n.CookieLocaleResolver; 
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; 
import org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping; 

@Configuration 
public class Config { 
    @Bean 
    public LocaleResolver localeResolver() { 
     final CookieLocaleResolver ret = new CookieLocaleResolver(); 
     ret.setDefaultLocale(new Locale("en_US")); 
     return ret; 
    } 

    @Bean 
    public MessageSource messageSource() { 
     final ReloadableResourceBundleMessageSource ret = new ReloadableResourceBundleMessageSource(); 
     ret.setBasename("classpath:lang"); 
     ret.setDefaultEncoding("UTF-8"); 
     return ret; 
    } 

    @Bean 
    public HandlerMapping handlerMapping() { 
     final LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor(); 
     interceptor.setParamName("language"); 

     final DefaultAnnotationHandlerMapping ret = new DefaultAnnotationHandlerMapping(); 
     ret.setInterceptors(new Object[] { interceptor }); 
     return ret; 
    } 
} 

上記は私の注釈設定です。私は基本的にチュートリアルのXML thisを翻訳しました。Spring MVC LocaleChangeInterceptor注釈ベースは機能しません

...?language=frに行ったとき、奇妙なことに動作しません。

ただし、次の(通知はここでそれがlocaleを使用します)(app-servlet.xmlで)作業を行います。

<mvc:interceptors> 
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> 
     <property name="paramName" value="locale" /> 
    </bean> 
</mvc:interceptors> 

注意すべきもう一つの重要な事は、私が上記の方法でブレークポイントを置くときということである、の3の全てそれらのすべてのブレークポイントは中断します。これは、「誰か」が値を読み取っていることを意味します。

なぜ、私の注釈ベースのインターセプタは機能しないのですか?

答えて

13

拡張設定クラスWebMvcConfigurerAdapterが役立ちます。 インターセプタエントリの上書きを追加する

public void addInterceptors(InterceptorRegistry registry) { 
    registry.addInterceptor(localeChangeInterceptor()); 
} 

メソッドを追加する。

@Bean(name = "localeResolver") 
public LocaleResolver getLocaleResolver(){ 
    return new CookieLocaleResolver(); 
} 

Bean名が重要です: もまたLocaleChangeInterceptor

@Bean 
public LocaleChangeInterceptor localeChangeInterceptor(){ 
    LocaleChangeInterceptor localeChangeInterceptor=new LocaleChangeInterceptor(); 
    localeChangeInterceptor.setParamName("language"); 
    return localeChangeInterceptor; 
} 
10

のための豆のエントリを追加するには言うスワップ、あなたが追加する必要があります。それが、春が正しいロケールリゾルバを解決する方法です。

また、SessionLocaleResolverを返すこともできます。

あなたがこれを追加しない場合は、次のエラーを取得します:Spring MVCの4.1.4.RELEASEローカリゼーションの完全な例が掲載されて

Cannot change HTTP accept header - use a different locale resolution strategy 
+0

ありがとうございます - 豆の名前はトリックです! – Henrik

+0

はい、そうです。 Beanの名前はソリューション@Bean(name = "localeResolver")です。 –

5

を。 また、MKYongのexampleを使用することもできます(残念ながら、configはXMLに基づいています)。プロジェクト構造の問題を解決するために使用できます。

package com.pizza.config; 

import org.springframework.context.MessageSource; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.support.ReloadableResourceBundleMessageSource; 
import org.springframework.web.servlet.LocaleResolver; 
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 
import org.springframework.web.servlet.i18n.CookieLocaleResolver; 
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; 
import org.springframework.web.servlet.view.InternalResourceViewResolver; 
import org.springframework.web.servlet.view.JstlView; 

@Configuration 
@EnableWebMvc 
@ComponentScan(value = "com.pizza") 
public class WebConfig extends WebMvcConfigurerAdapter { 

    /* Resolvers and other MVC needs */ 

    @Bean 
    public InternalResourceViewResolver getInternalResourceViewResolver() { 
     InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 

     resolver.setViewClass(JstlView.class); 
     resolver.setPrefix("/WEB-INF/views/"); 
     resolver.setSuffix(".jsp"); 

     return resolver; 
    } 

    @Override 
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
     configurer.enable(); 
    } 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); 
    } 


    /* Localization section is started */ 

    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 
     registry.addInterceptor(localeChangeInterceptor()); 
    } 

    @Bean 
    public LocaleChangeInterceptor localeChangeInterceptor(){ 
     LocaleChangeInterceptor localeChangeInterceptor=new LocaleChangeInterceptor(); 
     localeChangeInterceptor.setParamName("language"); 
     return localeChangeInterceptor; 
    } 

    @Bean(name = "localeResolver") 
    public LocaleResolver getLocaleResolver(){ 
     return new CookieLocaleResolver(); 
    } 

    @Bean 
    public MessageSource messageSource() { 
     final ReloadableResourceBundleMessageSource ret = new ReloadableResourceBundleMessageSource(); 
     ret.setBasename("classpath:languages"); 
     ret.setDefaultEncoding("UTF-8"); 
     return ret; 
    } 

} 
関連する問題