Spring MVC LocaleChangeInterceptor注释不起作用

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。

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

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

      

另一个需要注意的重要事项是,当我在上述方法中放置断点时,所有这三个方法中的每个断点都会断开,这意味着“某人”正在读取值。

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

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

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

方法。 还为LocaleChangeInterceptor添加bean条目

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

除了swap之外,还需要添加:

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

bean名称很重要。 这就是spring解析正确的语言环境解析器的方式。

或者,您可以返回SessionLocaleResolver。

如果您不添加此项,您将收到以下错误:

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

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