- 在使用cookie信息完成国际化的项目中,摸索使用CookieLocaleResolver,我们调用Springboot为我们集成的CookieLocaleResolver类,发现两个项目生成的cookie的value不同。
- 项目1:cookie: locale=zh_CN
- 项目2:cookie: locale=zh-CN
- 追踪CookieLocaleResolver中的addCookie()方法:
this.addCookie(response, (locale != null ? this.toLocaleValue(locale) : "-")
+ (timeZone != null ? '/' + timeZone.getID() : ""));
- 继续查看
this.toLocaleValue(locale)
方法找到如下代码:
protected String toLocaleValue(Locale locale) {
return this.isLanguageTagCompliant() ? locale.toLanguageTag() : locale.toString();
}
- 此时看到三元表达式通过
isLanguageTagCompliant()
决定使用toLanguageTag()
ortoString()
- 创建demo测试
toLanguageTag()
ortoString()
的不同:
public String testLocale(){
Locale locale = new Locale("zh","CN");
return "toLanguageTag()方法:"+locale.toLanguageTag() +";toString()方法"+ locale.toString();
}
- 输出内容:toLanguageTag()方法:zh-CN;toString()方法zh_CN
- 此时我们知道了此处两个项目使用的转换字符串的方法不同,点开
isLanguageTagCompliant()
方法,看它是如何决定用那个方法的:
public boolean isLanguageTagCompliant() {
return this.languageTagCompliant;
}
- 查看
languageTagCompliant
值,是直接定义在CookieLocaleResolver
类中但是不同的Spring-webmvc版本值是不同的:
spring-webmvc-5.1.5.RELEASE.jar
中:
private boolean languageTagCompliant = true;
spring-webmvc-5.0.9.RELEASE.jar
中:
private boolean languageTagCompliant = false;
疑惑解决:不同的spring-webmvc版本默认转换字符串的方式是不一样的。