最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring MessageSource獲取消息不符合預(yù)期的問題解決方案

 更新時(shí)間:2024年01月31日 08:37:58   作者:基督山伯爵_Neo  
最近我參與的產(chǎn)品要做國際化支持,選擇了用Spring MessageSource來實(shí)現(xiàn),這個(gè)Spring 框架提供的工具使用很簡單,網(wǎng)上有各種教程文章,這里不做贅述,只說一個(gè)實(shí)際遇到的問題及解決方案,需要的朋友可以參考下

場景

  • 項(xiàng)目需要支持中、英文,所以在 spring boot 項(xiàng)目 resources 目錄下創(chuàng)建兩個(gè)消息配置文件 messages.propertiesmessages_en.properties 分別對應(yīng)中文和英文消息。
  • 項(xià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);
    }

}
  • 項(xiàng)目打包為docker鏡像,部署到了K8S集群上,關(guān)鍵信息是:構(gòu)建docker鏡像的基礎(chǔ)鏡像的默認(rèn)語言是英文。

問題

當(dāng)瀏覽器請求接口,攜帶請求頭信息為zh(期望獲取中文消息時(shí)),通過上面的工具類方法始終獲取到的是英文消息,不符合預(yù)期!

Spring 的 MessageSource 的工作方式

MessageSource在查找消息時(shí),會首先嘗試使用與當(dāng)前Locale完全匹配的消息文件。如果沒有找到完全匹配的文件,它會逐步回退到更通用的語言設(shè)置,最后回退到默認(rèn)的messages.properties文件。

  • 我創(chuàng)建了一個(gè)新的Locale對象,其語言設(shè)置為zh。然而,我的項(xiàng)目中沒有一個(gè)名為messages_zh.properties的文件,那么MessageSource將無法找到與zh完全匹配的消息文件。在這種情況下,它會回退到默認(rèn)的messages.properties文件。
  • 我的產(chǎn)品構(gòu)建成docker鏡像,實(shí)際運(yùn)行在docker中,構(gòu)建docker鏡像的基礎(chǔ)鏡像的默認(rèn)語言設(shè)置是英文。MessageSource在回退到默認(rèn)消息文件之前,會嘗試使用與操作系統(tǒng)語言設(shè)置匹配的消息文件。 在我的項(xiàng)目中對應(yīng)的就是 messages_en.properties。
  • 最后才會根據(jù)默認(rèn)消息配置文件messages.properties返回消息。
  • 另外,new Locale(language)方法創(chuàng)建Locale時(shí),參數(shù)language大小寫 會影響結(jié)果,所以最好把language參數(shù)轉(zhuǎn)換成小寫,然后調(diào)用該方法。

解決辦法

  • Dockerfile 中添加行設(shè)置默認(rèn)語言為中文,根據(jù)上面提到的機(jī)制,先找完全匹配的messages_zh.properties,然后嘗試使用與操作系統(tǒng)語言設(shè)置匹配的消息文件messages_zh.properties,因?yàn)檫@個(gè)消息文件不存在,所以使用messages.properties
ENV LANG zh_CN.UTF-8
  • 設(shè)置應(yīng)用程序的默認(rèn)語言為中文,在啟動類中添加一行代碼
@SpringBootApplication
public class AppApplication {

    public static void main(String[] args) {
        // 設(shè)置默認(rèn)語言為中文
        Locale.setDefault(new Locale("zh"));
        SpringApplication.run(AppApplication.class, args);
    }

}
  • 在resources目錄下新建messages_zh.properties消息文件。

附錄

Locale對象在Java中用于表示特定的地理、政治或文化區(qū)域。在創(chuàng)建Locale對象時(shí),我們通常會傳入一個(gè)語言代碼,這個(gè)代碼通常是一個(gè)ISO 639 alpha-2alpha-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)文章

  • Groovy編程入門攻略

    Groovy編程入門攻略

    這篇文章主要介紹了Groovy編程入門攻略,Groovy是一種同樣使用Java虛擬機(jī)的動態(tài)語言,需要的朋友可以參考下
    2015-07-07
  • Java之ThreadPoolExecutor類詳解

    Java之ThreadPoolExecutor類詳解

    這篇文章主要介紹了Java之ThreadPoolExecutor類詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 詳解Spring Boot集成MyBatis(注解方式)

    詳解Spring Boot集成MyBatis(注解方式)

    本篇文章主要介紹了詳解Spring Boot集成MyBatis(注解方式),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • Spring Boot中的JdbcTemplate是什么及用法小結(jié)

    Spring Boot中的JdbcTemplate是什么及用法小結(jié)

    Spring Boot中的JdbcTemplate是一個(gè)強(qiáng)大的數(shù)據(jù)庫訪問工具,它簡化了數(shù)據(jù)庫操作的過程,在本文中,我們了解了JdbcTemplate的基本概念,并演示了如何在Spring Boot應(yīng)用程序中使用它,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • spring aop的簡單使用方法詳解

    spring aop的簡單使用方法詳解

    這篇文章主要介紹了spring aop的簡單使用方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 詳解Spring DeferredResult異步操作使用場景

    詳解Spring DeferredResult異步操作使用場景

    本文主要介紹了Spring DeferredResult異步操作使用場景,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Java POI實(shí)現(xiàn)將導(dǎo)入Excel文件的示例代碼

    Java POI實(shí)現(xiàn)將導(dǎo)入Excel文件的示例代碼

    這篇文章主要介紹了Java POI實(shí)現(xiàn)將導(dǎo)入Excel文件的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-02-02
  • 使用mybatis切片實(shí)現(xiàn)數(shù)據(jù)權(quán)限控制的操作流程

    使用mybatis切片實(shí)現(xiàn)數(shù)據(jù)權(quán)限控制的操作流程

    數(shù)據(jù)權(quán)限控制需要對查詢出的數(shù)據(jù)進(jìn)行篩選,對業(yè)務(wù)入侵最少的方式就是利用mybatis或者數(shù)據(jù)庫連接池的切片對已有業(yè)務(wù)的sql進(jìn)行修改,本文給大家介紹了使用mybatis切片實(shí)現(xiàn)數(shù)據(jù)權(quán)限控制的操作流程,需要的朋友可以參考下
    2024-07-07
  • Mybatis如何動態(tài)創(chuàng)建表

    Mybatis如何動態(tài)創(chuàng)建表

    這篇文章主要介紹了Mybatis如何動態(tài)創(chuàng)建表問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Spring如何使用@Indexed加快啟動速度

    Spring如何使用@Indexed加快啟動速度

    這篇文章主要介紹了Spring如何使用@Indexed加快啟動速度,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論

丰都县| 唐山市| 常山县| 兴义市| 塔城市| 普格县| 横山县| 固安县| 云和县| 山阴县| 疏勒县| 鄂尔多斯市| 阳谷县| 渭源县| 绩溪县| 宜兰县| 苗栗县| 武冈市| 昌都县| 孝昌县| 图木舒克市| 阿拉善左旗| 阿拉善盟| 饶河县| 凉山| 怀远县| 敦化市| 密云县| 邵武市| 隆德县| 兖州市| 广饶县| 夏河县| 诏安县| 兖州市| 资中县| 拉孜县| 土默特右旗| 漯河市| 绥江县| 班戈县|