- 在使用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版本默認轉換字符串的方式是不一樣的。