2012-08-01 148 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; 
    } 
} 

以上是我的注释配置。我已经基本翻译了this教程的XML。基于Spring MVC LocaleChangeInterceptor注解不起作用

奇怪的是,当我去...?language=fr时它不起作用。

但是,以下不工作(在app-servlet.xml)(注意这里它使用locale):

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

需要注意的另一个重要的事情是,当我把上面的方法断点,所有三个的他们,每个断点都会断裂,这意味着“某人”正在阅读这些值。

那么,为什么我的基于注释的拦截器不工作?

回答

13

扩展配置类WebMvcConfigurerAdapter可能会有所帮助。 添加拦截器条目覆盖

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

方法。 也为LocaleChangeInterceptor

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

加豆进入除了什么交换说,你需要添加:

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

的bean名字是很重要的。这就是Spring将解析正确的区域设置解析器的方式。

或者,您可以返回SessionLocaleResolver。

如果不加这个,你会得到以下错误:

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

谢谢 - 豆的名字是诀窍! – Henrik 2013-10-20 18:42:26

+0

是的,你是对的。 bean的名字是解决方案@Bean(name =“localeResolver”) – 2015-05-22 04:12:29

5

Spring MVC的4.1.4.RELEASE本地化的完整的例子张贴。 也可以使用MKYong的example(但不幸的是它的配置基于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; 
    } 

}