Spring MessageSource获取消息不符合预期的问题解决方案

 更新时间:2024年01月31日 08:37:58   作者:基督山伯爵_Neo  
最近我参与的产品要做国际化支持,选择了用Spring MessageSource来实现,这个Spring 框架提供的工具使用很简单,网上有各种教程文章,这里不做赘述,只说一个实际遇到的问题及解决方案,需要的朋友可以参考下

场景

  • 项目需要支持中、英文,所以在 spring boot 项目 resources 目录下创建两个消息配置文件 messages.propertiesmessages_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文件。

  • 我创建了一个新的Locale对象,其语言设置为zh。然而,我的项目中没有一个名为messages_zh.properties的文件,那么MessageSource将无法找到与zh完全匹配的消息文件。在这种情况下,它会回退到默认的messages.properties文件。
  • 我的产品构建成docker镜像,实际运行在docker中,构建docker镜像的基础镜像的默认语言设置是英文。MessageSource在回退到默认消息文件之前,会尝试使用与操作系统语言设置匹配的消息文件。 在我的项目中对应的就是 messages_en.properties
  • 最后才会根据默认消息配置文件messages.properties返回消息。
  • 另外,new Locale(language)方法创建Locale时,参数language大小写 会影响结果,所以最好把language参数转换成小写,然后调用该方法。

解决办法

  • Dockerfile 中添加行设置默认语言为中文,根据上面提到的机制,先找完全匹配的messages_zh.properties,然后尝试使用与操作系统语言设置匹配的消息文件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中用于表示特定的地理、政治或文化区域。在创建Locale对象时,我们通常会传入一个语言代码,这个代码通常是一个ISO 639 alpha-2alpha-3语言代码。 以下是一些常见的语言代码和对应的语言:

  • "en" - 英语
  • "zh" - 中文
  • "fr" - 法语
  • "de" - 德语
  • "ja" - 日语
  • "ko" - 韩语
  • "ru" - 俄语
  • "es" - 西班牙语

到此这篇关于Spring MessageSource获取消息不符合预期的问题解决方案的文章就介绍到这了,更多相关Spring MessageSource消息不符预期内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中的 HTTP 协议原理详解

    Java中的 HTTP 协议原理详解

    这篇文章主要介绍了Java中的 HTTP 协议原理详解,HTTP超文本传输协议,下文简称 HTTP,它的作用是用于实现服务器端和客户端的数据传输的
    2022-07-07
  • java中多线程加锁的四种方式

    java中多线程加锁的四种方式

    Java中实现多线程安全的关键是加锁,主要方式有synchronized关键字、ReentrantLock类、ReadWriteLock接口和Semaphore类,本文就来介绍一下这四种方式,感兴趣的可以了解一下
    2024-10-10
  • Java开发常见错误之数值计算精度和舍入问题详析

    Java开发常见错误之数值计算精度和舍入问题详析

    除了使用Double保存浮点数可能带来精度问题外,更匪夷所思的是这种精度问题,下面这篇文章主要给大家介绍了关于Java开发常见错误之数值计算精度和舍入问题的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • SpringBoot利用jpa连接MySQL数据库的方法

    SpringBoot利用jpa连接MySQL数据库的方法

    这篇文章主要介绍了SpringBoot利用jpa连接MySQL数据库的方法,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • Java Http请求方式之RestTemplate常用方法详解

    Java Http请求方式之RestTemplate常用方法详解

    这篇文章主要为大家介绍了Java Http请求方式之RestTemplate常用方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • MyBatisPuls多数据源操作数据源偶尔报错问题

    MyBatisPuls多数据源操作数据源偶尔报错问题

    这篇文章主要介绍了MyBatisPuls多数据源操作数据源偶尔报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Java源码深度分析String与StringBuffer及StringBuilder详解

    Java源码深度分析String与StringBuffer及StringBuilder详解

    当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder类,和String类不同的是,StringBuffer和 StringBuilder类的对象能够被多次的修改,并且不产生新的未使用对象,本篇我们来分析分析它们的源码
    2022-05-05
  • 详解Java-Jackson使用

    详解Java-Jackson使用

    这篇文章主要介绍了Java-Jackson使用详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • SpringBoot整合easy-es的详细过程

    SpringBoot整合easy-es的详细过程

    本文介绍了EasyES,一个基于Elasticsearch的ORM框架,旨在简化开发流程并提高效率,EasyES支持SpringBoot框架,并提供了CRUD操作、批量操作和查询操作等方法,文章还列举了使用EasyES时可能遇到的技术难题及解决方法,感兴趣的朋友一起看看吧
    2025-02-02
  • Java this关键字的使用详解

    Java this关键字的使用详解

    this 关键字是 Java 常用的关键字,可用于任何实例方法内指向当前对象,也可指向对其调用当前方法的对象,或者在需要当前类型对象引用时使用
    2021-11-11

最新评论