1. 程式人生 > 程式設計 >Springmvc國際化自動配置程式碼實現

Springmvc國際化自動配置程式碼實現

在 springmvc 中通過 LocalResover 獲取區域資訊物件 Local(對語言資訊、國家程式碼等的封裝),進行國際化配置,在 springboot 為我們提供了預設的區域資訊解析器

@Configuration(
  proxyBeanMethods = false
)
@ConditionalOnWebApplication(
  type = Type.SERVLET
)
@ConditionalOnClass({Servlet.class,DispatcherServlet.class,WebMvcConfigurer.class})
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class,TaskExecutionAutoConfiguration.class,ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {
  public static final String DEFAULT_PREFIX = "";
  public static final String DEFAULT_SUFFIX = "";
  private static final String[] SERVLET_LOCATIONS = new String[]{"/"};
 
    @Bean
    @ConditionalOnMissingBean  //容器中沒有 LocaleResolver 時
    @ConditionalOnProperty(
      prefix = "spring.mvc",name = {"locale"}
    )
    public LocaleResolver localeResolver() {        //如果屬性中指定用固定的就用固定的 FixedLocaleResolver 區域化資訊解析器
      if (this.mvcProperties.getLocaleResolver() == org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties.LocaleResolver.FIXED) {
        return new FixedLocaleResolver(this.mvcProperties.getLocale());
      } else {          //否則使用 AcceptHeaderLocaleResolver 區域化資訊解析器
        AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
        localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
        return localeResolver;
      }
    }

AcceptHeaderLocaleResolver 在 request 請求頭中獲取到區域資訊

public class AcceptHeaderLocaleResolver implements LocaleResolver {
  private final List<Locale> supportedLocales = new ArrayList(4);
 
  public Locale resolveLocale(HttpServletRequest request) {
    Locale defaultLocale = this.getDefaultLocale();
    if (defaultLocale != null && request.getHeader("Accept-Language") == null) {
      return defaultLocale;
    } else {
      Locale requestLocale = request.getLocale();
      List<Locale> supportedLocales = this.getSupportedLocales();
      if (!supportedLocales.isEmpty() && !supportedLocales.contains(requestLocale)) {
        Locale supportedLocale = this.findSupportedLocale(request,supportedLocales);
        if (supportedLocale != null) {
          return supportedLocale;
        } else {
          return defaultLocale != null ? defaultLocale : requestLocale;
        }
      } else {
        return requestLocale;
      }
    }
  }

預設就是更具請求頭帶來的區域資訊獲取 Local 進行國際化

我們可以通過定義自己的區域化解析器生成區域化資訊

public class MyLocaleResolver implements LocaleResolver {  
  @Override
  public Locale resolveLocale(HttpServletRequest request) {
    String l = request.getParameter("l");
    Locale locale = Locale.getDefault();
    if(!StringUtils.isEmpty(l)){
      String[] split = l.split("_");
      locale = new Locale(split[0],split[1]);
    }
    return locale;
  }
  @Override
  public void setLocale(HttpServletRequest request,HttpServletResponse response,Locale locale) {
  }
}
 
@Configuration
public class MyMvcConfig extends WebMvcConfigurerAdapter {
  @Bean
  public LocaleResolver localeResolver(){
    return new MyLocaleResolver();
  }
}

量變引起質變,這就是我所理解的因果。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。