Spring MessageSource获取消息不符合预期的问题解决方案
场景
- 项目需要支持中、英文,所以在
spring boot
项目resources
目录下创建两个消息配置文件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
文件。
- 我创建了一个新的
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-2
或alpha-3
语言代码。 以下是一些常见的语言代码和对应的语言:
- "en" - 英语
- "zh" - 中文
- "fr" - 法语
- "de" - 德语
- "ja" - 日语
- "ko" - 韩语
- "ru" - 俄语
- "es" - 西班牙语
到此这篇关于Spring MessageSource获取消息不符合预期的问题解决方案的文章就介绍到这了,更多相关Spring MessageSource消息不符预期内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
如何使用Jackson和JSON Pointer查询解析任何JSON节点
本文介绍了JSON Pointer是字符串表达式,可以非常方便解析复杂JSON节点值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-09-09java servlet结合Oracle搭建java的web开发环境
今天我将与大家分享一下我学JAVA WEB写的一些小实例 ,我个人是不太喜欢书本上的晦涩的概念的,所以我花了更多的时间在一些应用实例上,我觉得这样的学习方式很适合我,由简到繁,由浅入深2015-12-12springcloud中RabbitMQ死信队列与延迟交换机实现方法
死信队列是消息队列中非常重要的概念,同时我们需要业务场景中都需要延迟发送的概念,比如12306中的30分钟后未支付订单取消,那么本期,我们就来讲解死信队列,以及如何通过延迟交换机来实现延迟发送的需求,感兴趣的朋友一起看看吧2022-05-05SpringBoot集成ElasticSearch(ES)实现全文搜索功能
Elasticsearch是一个开源的分布式搜索和分析引擎,它被设计用于处理大规模数据集,它提供了一个分布式多用户能力的全文搜索引擎,本文将给大家介绍SpringBoot集成ElasticSearch(ES)实现全文搜索功能,需要的朋友可以参考下2024-02-02
最新评论