2012-08-01 11 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 ट्यूटोरियल के एक्सएमएल का अनुवाद किया है।स्प्रिंग एमवीसी लोकेल चेंजइंटरसेप्टर एनोटेशन आधारित काम नहीं करता

आश्चर्यजनक रूप से यह काम नहीं करता है जब मैं ...?language=fr पर जाता हूं।

हालांकि, निम्नलिखित काम (app-servlet.xml में) (नोटिस यहाँ यह locale उपयोग कर रहा है) करता है:

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

नोट करने के लिए एक अन्य महत्वपूर्ण बात यह है कि जब मैं ऊपर तरीकों पर breakpoints, के तीन के सभी डाल उन्हें, हर ब्रेकपॉइंट ब्रेक करता है, जिसका अर्थ है कि "कोई" मान पढ़ रहा है।

तो, मेरा एनोटेशन आधारित इंटरसेप्टर क्यों काम नहीं करेगा?

उत्तर

13

WebMvcConfigurerAdapter द्वारा कॉन्फ़िगरेशन क्लास को विस्तारित करने में सहायता मिल सकती है। जोड़ने के लिए इंटरसेप्टर प्रवेश ओवरराइड

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

विधि।

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

सेम नाम महत्वपूर्ण है: भी के लिए LocaleChangeInterceptor

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

सेम प्रविष्टि जोड़ने के अलावा करने के लिए क्या स्वैप कहते हैं, आप जोड़ने की जरूरत है। वसंत सही लोकेल रिज़ॉल्वर को हल करने का तरीका है।

वैकल्पिक रूप से आप सत्र लॉकेलरोलॉल्वर वापस कर सकते हैं।

आप इस नहीं जोड़ते हैं तो आपको निम्न त्रुटि प्राप्त होगा:

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

धन्यवाद - बीन का नाम चाल है! – Henrik

+0

हाँ, आप सही हैं। बीन का नाम समाधान @ बीन (नाम = "लोकेल रिसेल्वर") है –

5

वसंत MVC 4.1.4.RELEASE स्थानीयकरण से भरा उदाहरण पोस्ट किया जाता है। आप परियोजना संरचना के साथ समस्याओं को हल करने के लिए एमकेओओंग के example (लेकिन दुर्भाग्य से इसकी कॉन्फ़िगरेशन एक्सएमएल पर आधारित है) का उपयोग कर सकते हैं।

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

}