Spring MessageSource獲取消息不符合預期的問題解決方案
場景
- 項目需要支持中、英文,所以在
spring boot
項目resources
目錄下創(chuàng)建兩個消息配置文件messages.properties
和messages_en.properties
分別對應中文和英文消息。 - 項目中使用以下代碼獲取對應語種的消息(通過code)
@Component @RequiredArgsConstructor public class LocalizationUtils { private final MessageSource messageSource; public String getLocalizedMessageFromCode(String code) { // 語種信息由請求通過請求頭攜帶,例如英文為en_us final Locale locale = new Locale(language); return messageSource.getMessage(code, null, locale); } }
- 項目打包為
docker
鏡像,部署到了K8S集群上,關鍵信息是:構建docker鏡像的基礎鏡像的默認語言是英文。
問題
當瀏覽器請求接口,攜帶請求頭信息為zh(期望獲取中文消息時),通過上面的工具類方法始終獲取到的是英文消息,不符合預期!
Spring 的 MessageSource 的工作方式
MessageSource
在查找消息時,會首先嘗試使用與當前Locale
完全匹配的消息文件。如果沒有找到完全匹配的文件,它會逐步回退到更通用的語言設置,最后回退到默認的messages.properties
文件。
- 我創(chuàng)建了一個新的
Locale
對象,其語言設置為zh。然而,我的項目中沒有一個名為messages_zh.properties
的文件,那么MessageSource
將無法找到與zh完全匹配的消息文件。在這種情況下,它會回退到默認的messages.properties
文件。 - 我的產品構建成docker鏡像,實際運行在docker中,構建docker鏡像的基礎鏡像的默認語言設置是英文。而
MessageSource
在回退到默認消息文件之前,會嘗試使用與操作系統(tǒng)語言設置匹配的消息文件。 在我的項目中對應的就是messages_en.properties
。 - 最后才會根據默認消息配置文件
messages.properties
返回消息。 - 另外,
new Locale(language)
方法創(chuàng)建Locale
時,參數language
大小寫 會影響結果,所以最好把language
參數轉換成小寫,然后調用該方法。
解決辦法
Dockerfile
中添加行設置默認語言為中文,根據上面提到的機制,先找完全匹配的messages_zh.properties
,然后嘗試使用與操作系統(tǒng)語言設置匹配的消息文件messages_zh.properties
,因為這個消息文件不存在,所以使用messages.properties
。
ENV LANG zh_CN.UTF-8
- 設置應用程序的默認語言為中文,在啟動類中添加一行代碼
@SpringBootApplication public class AppApplication { public static void main(String[] args) { // 設置默認語言為中文 Locale.setDefault(new Locale("zh")); SpringApplication.run(AppApplication.class, args); } }
- 在resources目錄下新建
messages_zh.properties
消息文件。
附錄
Locale
對象在Java
中用于表示特定的地理、政治或文化區(qū)域。在創(chuàng)建Locale對象時,我們通常會傳入一個語言代碼,這個代碼通常是一個ISO 639 alpha-2
或alpha-3
語言代碼。 以下是一些常見的語言代碼和對應的語言:
- "en" - 英語
- "zh" - 中文
- "fr" - 法語
- "de" - 德語
- "ja" - 日語
- "ko" - 韓語
- "ru" - 俄語
- "es" - 西班牙語
到此這篇關于Spring MessageSource獲取消息不符合預期的問題解決方案的文章就介紹到這了,更多相關Spring MessageSource消息不符預期內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java?Http請求方式之RestTemplate常用方法詳解
這篇文章主要為大家介紹了Java?Http請求方式之RestTemplate常用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09Java源碼深度分析String與StringBuffer及StringBuilder詳解
當對字符串進行修改的時候,需要使用?StringBuffer?和?StringBuilder類,和String類不同的是,StringBuffer和?StringBuilder類的對象能夠被多次的修改,并且不產生新的未使用對象,本篇我們來分析分析它們的源碼2022-05-05