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

Ở trên là cấu hình chú thích của tôi. Tôi đã dịch một cách cơ bản this XML của hướng dẫn.Chú thích dựa trên Spring MVC LocaleChangeInterceptor không hoạt động

Thật lạ là nó không hoạt động khi tôi đi đến ...?language=fr.

Tuy nhiên, sau đây làm việc (trong app-servlet.xml) (thông báo ở đây nó đang sử dụng locale):

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

Một điều quan trọng cần lưu ý là khi tôi đặt breakpoint trên các phương pháp trên, tất cả các ba chúng, mọi điểm dừng đều phá vỡ, ngụ ý rằng "ai đó" đang đọc các giá trị.

Vì vậy, tại sao trình chặn đánh chặn dựa trên chú thích của tôi không hoạt động?

Trả lời

13

Mở rộng lớp cấu hình theo WebMvcConfigurerAdapter có thể hữu ích. để thêm ghi đè mục nhập chặn ghi đè

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

. cũng thêm vào đậu cho LocaleChangeInterceptor

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

Ngoài những gì trao đổi nói, bạn cần phải thêm:

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

Tên đậu là rất quan trọng. Đó là cách mà lò xo sẽ ​​giải quyết đúng trình phân giải miền địa phương.

Hoặc bạn có thể trả về SessionLocaleResolver.

Nếu bạn không thêm này, bạn sẽ nhận được lỗi sau:

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

Cảm ơn - tên của hạt là thủ thuật! – Henrik

+0

Vâng, bạn nói đúng. Tên của bean là giải pháp @Bean (name = "localeResolver") –

5

Ví dụ đầy đủ các nội địa hóa Spring MVC 4.1.4.RELEASE được đăng. Ngoài ra, bạn có thể sử dụng số example của MKYong (nhưng tiếc là cấu hình của nó dựa trên XML) để giải quyết các vấn đề với cấu trúc dự án.

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

} 
Các vấn đề liên quan