欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Springboot自动配置和自定义LocaleResolver(解析用户区域)

程序员文章站 2022-07-10 18:49:10
一、概述在项目开发过程中,可能会针对不同的国家的用户提供不同的视图,如针对日本用户提供一个视图,针对中国用户提供一个视图,这时候就需提供在同个页面上,能切换不同的语言,而LocaleResolver能够帮我们实现这种切换。二、LocaleResolver的概述LocaleResolver是spring提供的一个接口public interface LocaleResolver { //根据request请求获取locale Locale resolveLocale(HttpSe...

一、概述
在项目开发过程中,可能会针对不同的国家的用户提供不同的视图,如针对日本用户提供一个视图,针对中国用户提供一个视图,这时候就需提供在同个页面上,能切换不同的语言,而LocaleResolver能够帮我们实现这种切换。

二、LocaleResolver的概述
LocaleResolver是spring提供的一个接口

public interface LocaleResolver {
       //根据request请求获取locale
    Locale resolveLocale(HttpServletRequest var1);
     //设置lacale的样式
    void setLocale(HttpServletRequest var1, @Nullable HttpServletResponse var2, @Nullable Locale var3);
} 

三、LocaleResolver的自动配置

Springboot中WebMvcAutoConfiguration自动配置了 LocaleResolver,spring.mvc.locale可以配置localeResolver的属性值,不配置的话选择默认,即根据系统的语言返回页面显示

@Bean
		@ConditionalOnMissingBean
		@ConditionalOnProperty(prefix = "spring.mvc", name = "locale")
		public LocaleResolver localeResolver() {
			if (this.mvcProperties.getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) {
				return new FixedLocaleResolver(this.mvcProperties.getLocale());
			}
			AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
			//获取默认的locale
			localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
			return localeResolver; 

四、自定义LocaleResolver

当我们需要实现国际化时,则要创建 localeResolver的实现类,(实现类会让SpringBoot中自动配置的 localeResolver失效),同时实现接口的方法

public class MyLocaleResolver implements LocaleResolver {

    @Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
    //获取前端传来的数据
        String l = httpServletRequest.getParameter("l");
        Locale locale = Locale.getDefault();
        if (l != null && l.length() > 0) {
            String[] split = l.split("_");
           locale= new Locale(split[0], split[1]);
        }
        return locale;
    }

//Locale的构造方法,参数1:语言,参数2:国家
  public Locale(String language, String country) {
        this(language, country, "");
    } 

注入ioc容器中,交由spring来管理

 @Bean
    public LocaleResolver localeResolver(){
        return  new MyLocaleResolver();
    } 

此时,需要指定 LocaleResolver映射文件的属性, MessageSourceAutoConfiguration中的spring.message映射 LocaleResolver文件的位置

public class MessageSourceAutoConfiguration {

	private static final Resource[] NO_RESOURCES = {};
	@Bean                             //映射文件的属性
	@ConfigurationProperties(prefix = "spring.messages")
	public MessageSourceProperties messageSourceProperties() {
		return new MessageSourceProperties();
	}
	
	@Override
		public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
		                                                       //在application.properties下映射此配置文件的位置
			String basename = context.getEnvironment().getProperty("spring.messages.basename", "messages");
			ConditionOutcome outcome = cache.get(basename);
			if (outcome == null) {
				outcome = getMatchOutcomeForBasename(context, basename);
				cache.put(basename, outcome);
			} 

application.properties配置文件
spring.messages.basename=i18n/index
Springboot自动配置和自定义LocaleResolver(解析用户区域)

index中定义了不同的语言 

根据local里面的数据,来匹配对应的properties文件,找到对应的文件后,交给Springboot来处理,响应到页面上

五、总结
Springboot自定配置LocaleResolver,如果需要自定义,则要继承LocaleResolver接口,同时注入IOC容器中(参照Spirngboot自动配置LocaleResolver),配好映射文件的位置和属性,接下来springboot就会自动帮我们把数据响应给页面。

本文地址:https://blog.csdn.net/A232222/article/details/108238133