Spring MessageSource獲取消息不符合預(yù)期的問(wèn)題解決方案
場(chǎng)景
- 項(xiàng)目需要支持中、英文,所以在
spring boot
項(xiàng)目resources
目錄下創(chuàng)建兩個(gè)消息配置文件messages.properties
和messages_en.properties
分別對(duì)應(yīng)中文和英文消息。 - 項(xiàng)目中使用以下代碼獲取對(duì)應(yīng)語(yǔ)種的消息(通過(guò)code)
@Component @RequiredArgsConstructor public class LocalizationUtils { private final MessageSource messageSource; public String getLocalizedMessageFromCode(String code) { // 語(yǔ)種信息由請(qǐng)求通過(guò)請(qǐng)求頭攜帶,例如英文為en_us final Locale locale = new Locale(language); return messageSource.getMessage(code, null, locale); } }
- 項(xiàng)目打包為
docker
鏡像,部署到了K8S集群上,關(guān)鍵信息是:構(gòu)建docker鏡像的基礎(chǔ)鏡像的默認(rèn)語(yǔ)言是英文。
問(wèn)題
當(dāng)瀏覽器請(qǐng)求接口,攜帶請(qǐng)求頭信息為zh(期望獲取中文消息時(shí)),通過(guò)上面的工具類(lèi)方法始終獲取到的是英文消息,不符合預(yù)期!
Spring 的 MessageSource 的工作方式
MessageSource
在查找消息時(shí),會(huì)首先嘗試使用與當(dāng)前Locale
完全匹配的消息文件。如果沒(méi)有找到完全匹配的文件,它會(huì)逐步回退到更通用的語(yǔ)言設(shè)置,最后回退到默認(rèn)的messages.properties
文件。
- 我創(chuàng)建了一個(gè)新的
Locale
對(duì)象,其語(yǔ)言設(shè)置為zh。然而,我的項(xiàng)目中沒(méi)有一個(gè)名為messages_zh.properties
的文件,那么MessageSource
將無(wú)法找到與zh完全匹配的消息文件。在這種情況下,它會(huì)回退到默認(rèn)的messages.properties
文件。 - 我的產(chǎn)品構(gòu)建成docker鏡像,實(shí)際運(yùn)行在docker中,構(gòu)建docker鏡像的基礎(chǔ)鏡像的默認(rèn)語(yǔ)言設(shè)置是英文。而
MessageSource
在回退到默認(rèn)消息文件之前,會(huì)嘗試使用與操作系統(tǒng)語(yǔ)言設(shè)置匹配的消息文件。 在我的項(xiàng)目中對(duì)應(yīng)的就是messages_en.properties
。 - 最后才會(huì)根據(jù)默認(rèn)消息配置文件
messages.properties
返回消息。 - 另外,
new Locale(language)
方法創(chuàng)建Locale
時(shí),參數(shù)language
大小寫(xiě) 會(huì)影響結(jié)果,所以最好把language
參數(shù)轉(zhuǎn)換成小寫(xiě),然后調(diào)用該方法。
解決辦法
Dockerfile
中添加行設(shè)置默認(rèn)語(yǔ)言為中文,根據(jù)上面提到的機(jī)制,先找完全匹配的messages_zh.properties
,然后嘗試使用與操作系統(tǒng)語(yǔ)言設(shè)置匹配的消息文件messages_zh.properties
,因?yàn)檫@個(gè)消息文件不存在,所以使用messages.properties
。
ENV LANG zh_CN.UTF-8
- 設(shè)置應(yīng)用程序的默認(rèn)語(yǔ)言為中文,在啟動(dòng)類(lèi)中添加一行代碼
@SpringBootApplication public class AppApplication { public static void main(String[] args) { // 設(shè)置默認(rèn)語(yǔ)言為中文 Locale.setDefault(new Locale("zh")); SpringApplication.run(AppApplication.class, args); } }
- 在resources目錄下新建
messages_zh.properties
消息文件。
附錄
Locale
對(duì)象在Java
中用于表示特定的地理、政治或文化區(qū)域。在創(chuàng)建Locale對(duì)象時(shí),我們通常會(huì)傳入一個(gè)語(yǔ)言代碼,這個(gè)代碼通常是一個(gè)ISO 639 alpha-2
或alpha-3
語(yǔ)言代碼。 以下是一些常見(jiàn)的語(yǔ)言代碼和對(duì)應(yīng)的語(yǔ)言:
- "en" - 英語(yǔ)
- "zh" - 中文
- "fr" - 法語(yǔ)
- "de" - 德語(yǔ)
- "ja" - 日語(yǔ)
- "ko" - 韓語(yǔ)
- "ru" - 俄語(yǔ)
- "es" - 西班牙語(yǔ)
到此這篇關(guān)于Spring MessageSource獲取消息不符合預(yù)期的問(wèn)題解決方案的文章就介紹到這了,更多相關(guān)Spring MessageSource消息不符預(yù)期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
- 這篇文章主要介紹了Java中的?HTTP?協(xié)議原理詳解,HTTP超文本傳輸協(xié)議,下文簡(jiǎn)稱(chēng)?HTTP,它的作用是用于實(shí)現(xiàn)服務(wù)器端和客戶(hù)端的數(shù)據(jù)傳輸?shù)?/div> 2022-07-07
Java開(kāi)發(fā)常見(jiàn)錯(cuò)誤之?dāng)?shù)值計(jì)算精度和舍入問(wèn)題詳析
除了使用Double保存浮點(diǎn)數(shù)可能帶來(lái)精度問(wèn)題外,更匪夷所思的是這種精度問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Java開(kāi)發(fā)常見(jiàn)錯(cuò)誤之?dāng)?shù)值計(jì)算精度和舍入問(wèn)題的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11SpringBoot利用jpa連接MySQL數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了SpringBoot利用jpa連接MySQL數(shù)據(jù)庫(kù)的方法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10Java?Http請(qǐng)求方式之RestTemplate常用方法詳解
這篇文章主要為大家介紹了Java?Http請(qǐng)求方式之RestTemplate常用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09MyBatisPuls多數(shù)據(jù)源操作數(shù)據(jù)源偶爾報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了MyBatisPuls多數(shù)據(jù)源操作數(shù)據(jù)源偶爾報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06Java源碼深度分析String與StringBuffer及StringBuilder詳解
當(dāng)對(duì)字符串進(jìn)行修改的時(shí)候,需要使用?StringBuffer?和?StringBuilder類(lèi),和String類(lèi)不同的是,StringBuffer和?StringBuilder類(lèi)的對(duì)象能夠被多次的修改,并且不產(chǎn)生新的未使用對(duì)象,本篇我們來(lái)分析分析它們的源碼2022-05-05SpringBoot整合easy-es的詳細(xì)過(guò)程
本文介紹了EasyES,一個(gè)基于Elasticsearch的ORM框架,旨在簡(jiǎn)化開(kāi)發(fā)流程并提高效率,EasyES支持SpringBoot框架,并提供了CRUD操作、批量操作和查詢(xún)操作等方法,文章還列舉了使用EasyES時(shí)可能遇到的技術(shù)難題及解決方法,感興趣的朋友一起看看吧2025-02-02最新評(píng)論