Spring MessageSource獲取消息不符合預(yù)期的問題解決方案
場景
- 項目需要支持中、英文,所以在
spring boot項目resources目錄下創(chuàng)建兩個消息配置文件messages.properties和messages_en.properties分別對應(yīng)中文和英文消息。 - 項目中使用以下代碼獲取對應(yīng)語種的消息(通過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集群上,關(guān)鍵信息是:構(gòu)建docker鏡像的基礎(chǔ)鏡像的默認語言是英文。
問題
當瀏覽器請求接口,攜帶請求頭信息為zh(期望獲取中文消息時),通過上面的工具類方法始終獲取到的是英文消息,不符合預(yù)期!
Spring 的 MessageSource 的工作方式
MessageSource在查找消息時,會首先嘗試使用與當前Locale完全匹配的消息文件。如果沒有找到完全匹配的文件,它會逐步回退到更通用的語言設(shè)置,最后回退到默認的messages.properties文件。
- 我創(chuàng)建了一個新的
Locale對象,其語言設(shè)置為zh。然而,我的項目中沒有一個名為messages_zh.properties的文件,那么MessageSource將無法找到與zh完全匹配的消息文件。在這種情況下,它會回退到默認的messages.properties文件。 - 我的產(chǎn)品構(gòu)建成docker鏡像,實際運行在docker中,構(gòu)建docker鏡像的基礎(chǔ)鏡像的默認語言設(shè)置是英文。而
MessageSource在回退到默認消息文件之前,會嘗試使用與操作系統(tǒng)語言設(shè)置匹配的消息文件。 在我的項目中對應(yīng)的就是messages_en.properties。 - 最后才會根據(jù)默認消息配置文件
messages.properties返回消息。 - 另外,
new Locale(language)方法創(chuàng)建Locale時,參數(shù)language大小寫 會影響結(jié)果,所以最好把language參數(shù)轉(zhuǎn)換成小寫,然后調(diào)用該方法。
解決辦法
Dockerfile中添加行設(shè)置默認語言為中文,根據(jù)上面提到的機制,先找完全匹配的messages_zh.properties,然后嘗試使用與操作系統(tǒng)語言設(shè)置匹配的消息文件messages_zh.properties,因為這個消息文件不存在,所以使用messages.properties。
ENV LANG zh_CN.UTF-8
- 設(shè)置應(yīng)用程序的默認語言為中文,在啟動類中添加一行代碼
@SpringBootApplication
public class AppApplication {
public static void main(String[] args) {
// 設(shè)置默認語言為中文
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語言代碼。 以下是一些常見的語言代碼和對應(yīng)的語言:
- "en" - 英語
- "zh" - 中文
- "fr" - 法語
- "de" - 德語
- "ja" - 日語
- "ko" - 韓語
- "ru" - 俄語
- "es" - 西班牙語
到此這篇關(guān)于Spring MessageSource獲取消息不符合預(yù)期的問題解決方案的文章就介紹到這了,更多相關(guān)Spring MessageSource消息不符預(yù)期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot中的JdbcTemplate是什么及用法小結(jié)
Spring Boot中的JdbcTemplate是一個強大的數(shù)據(jù)庫訪問工具,它簡化了數(shù)據(jù)庫操作的過程,在本文中,我們了解了JdbcTemplate的基本概念,并演示了如何在Spring Boot應(yīng)用程序中使用它,感興趣的朋友跟隨小編一起看看吧2023-10-10
詳解Spring DeferredResult異步操作使用場景
本文主要介紹了Spring DeferredResult異步操作使用場景,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10
Java POI實現(xiàn)將導(dǎo)入Excel文件的示例代碼
這篇文章主要介紹了Java POI實現(xiàn)將導(dǎo)入Excel文件的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02
使用mybatis切片實現(xiàn)數(shù)據(jù)權(quán)限控制的操作流程
數(shù)據(jù)權(quán)限控制需要對查詢出的數(shù)據(jù)進行篩選,對業(yè)務(wù)入侵最少的方式就是利用mybatis或者數(shù)據(jù)庫連接池的切片對已有業(yè)務(wù)的sql進行修改,本文給大家介紹了使用mybatis切片實現(xiàn)數(shù)據(jù)權(quán)限控制的操作流程,需要的朋友可以參考下2024-07-07

