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

Lo anterior es la configuración de mi anotación. Básicamente, traduje el XML del tutorial this.Spring MVC LocaleChangeInterceptor basado en la anotación no funciona

Extrañamente, no funciona cuando voy al ...?language=fr.

Sin embargo, la siguiente funciona (en app-servlet.xml) (nótese que aquí se trata de utilizar locale):

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

Otra cosa importante a tener en cuenta es que cuando pongo puntos de interrupción en los métodos anteriores, todos los tres ellos, cada punto de quiebre se rompe, lo que implica que "alguien" está leyendo los valores.

Entonces, ¿por qué no funcionaría mi interceptor basado en anotaciones?

Respuesta

13

La clase de configuración extendida por WebMvcConfigurerAdapter puede ayudar. para añadir la entrada interceptor anular

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

método. también añadir la entrada de frijol LocaleChangeInterceptor

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

Además de lo que dice de intercambio, es necesario agregar:

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

El nombre del bean es importante. Esa es la forma en que la primavera resolverá el resolver local correcto.

Como alternativa, puede devolver el ResolutorLocable.

Si no agrega este obtendrá el siguiente error:

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

Thanks - the name of the bean es el truco! – Henrik

+0

Sí, tienes razón. El nombre de bean es la solución @Bean (name = "localeResolver") –

5

se publica El ejemplo completo de Spring MVC 4.1.4.RELEASE localización. También puede usar example de MKYong (pero desafortunadamente su configuración se basa en XML) para resolver los problemas con la estructura del proyecto.

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; 
    } 

} 
Cuestiones relacionadas