【问题标题】:Spring MVC LocaleChangeInterceptor annotation based doesn't work基于 Spring MVC LocaleChangeInterceptor 注释不起作用
【发布时间】:2012-07-29 23:07:09
【问题描述】:
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。

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

但是,以下方法确实有效(在app-servlet.xml 中)(注意这里使用的是locale):

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

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

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

【问题讨论】:

    标签: java spring localization internationalization


    【解决方案1】:

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

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

    方法。 还为LocaleChangeInterceptor添加bean条目

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

    【讨论】:

      【解决方案2】:

      除了swap说的,还需要补充:

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

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

      您也可以返回 SessionLocaleResolver。

      如果不添加这个会报如下错误:

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

      【讨论】:

      • 是的,你是对的。 bean的名字就是解决方案@Bean(name = "localeResolver")
      【解决方案3】:

      发布了 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;
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-20
        • 2018-09-04
        • 1970-01-01
        • 2017-01-14
        • 1970-01-01
        • 2014-08-14
        • 2023-03-24
        • 2015-07-11
        相关资源
        最近更新 更多