Springboot自动配置和自定义LocaleResolver(解析用户区域)
一、概述
在项目开发过程中,可能会针对不同的国家的用户提供不同的视图,如针对日本用户提供一个视图,针对中国用户提供一个视图,这时候就需提供在同个页面上,能切换不同的语言,而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
index中定义了不同的语言
根据local里面的数据,来匹配对应的properties文件,找到对应的文件后,交给Springboot来处理,响应到页面上
五、总结
Springboot自定配置LocaleResolver,如果需要自定义,则要继承LocaleResolver接口,同时注入IOC容器中(参照Spirngboot自动配置LocaleResolver),配好映射文件的位置和属性,接下来springboot就会自动帮我们把数据响应给页面。
本文地址:https://blog.csdn.net/A232222/article/details/108238133