当前位置: 首页 > news >正文

Spring 多模块配置国际化,MessageSource只能加载一个文件

前言  

      在写项目配置国际化的时候,因为我有多个模块项目:common、admin、image等,各自模块都有i18n的文件。

      但在配置MessageSource的时候发现只能加载一个文件,其他文件被丢弃了,导致code会找不到。

      后面在stackoverflow中找到了相关文章对其进行解释了:

https://stackoverflow.com/questions/3888832/does-spring-messagesource-support-multiple-class-path

1、原版写法(错误):

@Bean
public MessageSource messageSource() {ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();messageSource.setBasenames("classpath*:i18n/messages");messageSource.setDefaultEncoding("UTF-8");messageSource.setUseCodeAsDefaultMessage(true);return messageSource;
}

原因解释: 

         classpath* 语法是 Spring 的一种机制,它允许代码为给定路径加载多个资源。非常方便。然而, ResourceBundleMessageSource 使用标准的 java.util.ResourceBundle 来加载资源,这是一种更简单、更简单的机制,它将加载给定路径的第一个资源,并忽略其他所有内容。

2、解决方法

         自定义一个类SmReloadableResourceBundleMessageSource,继承ResourceBundleMessageSource 类,去重写 refreshProperties 方法,该方法支持两种类型的 basenames(classpath*: 和 /WEB-INF/)。

public class SmReloadableResourceBundleMessageSource extends ReloadableResourceBundleMessageSource {private static final String PROPERTIES_SUFFIX = ".properties";private PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();@Overrideprotected PropertiesHolder refreshProperties(String filename, PropertiesHolder propHolder) {if (filename.startsWith(PathMatchingResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX)) {return refreshClassPathProperties(filename, propHolder);} else {return super.refreshProperties(filename, propHolder);}}private PropertiesHolder refreshClassPathProperties(String filename, PropertiesHolder propHolder) {Properties properties = new Properties();long lastModified = -1;try {Resource[] resources = resolver.getResources(filename + PROPERTIES_SUFFIX);for (Resource resource : resources) {String sourcePath = resource.getURI().toString().replace(PROPERTIES_SUFFIX, "");PropertiesHolder holder = super.refreshProperties(sourcePath, propHolder);properties.putAll(holder.getProperties());if (lastModified < resource.lastModified())lastModified = resource.lastModified();}} catch (IOException ignored) {}return new PropertiesHolder(properties, lastModified);}
}

之后再去替换ReloadableResourceBundleMessageSource 类。

  @Beanpublic MessageSource messageSource() {SmReloadableResourceBundleMessageSource messageSource = new SmReloadableResourceBundleMessageSource();messageSource.setBasenames("classpath*:/i18n/messages");messageSource.setDefaultEncoding("UTF-8");messageSource.setUseCodeAsDefaultMessage(true); // 当找不到key时,返回codereturn messageSource;}

http://www.dtcms.com/a/284725.html

相关文章:

  • springboot 整合spring-kafka客户端:SASL_SSL+PLAINTEXT方式
  • mongodb 入门级别操作
  • Unity VR多人手术模拟恢复2:客户端移动同步问题分析与解决方案
  • jeecgbootvue3使用封装组件注意事项
  • 学习 Flutter (四):玩安卓项目实战 - 中
  • 【WPF】WPF 自定义控件之依赖属性
  • Matlab2025a软件安装|详细安装步骤➕安装文件|附下载文件
  • Mask2Former,分割新范式
  • Kafka 控制器(Controller)详解:架构、原理与实战
  • Python23 —— 标准库(time库)
  • c++列表初始化
  • Dijkstra 算法求解多种操作
  • Stone3D教程:免编码制作在线家居生活用品展示应用
  • 【初始Java】
  • mysql中where字段的类型转换
  • (转)Kubernetes基础介绍
  • SQL增查
  • Windows下odbc配置连接SQL Server
  • .Net将控制台的输出信息存入到日志文件按分钟生成日志文件
  • 【JavaEE进阶】使用云服务器搭建Linux环境
  • Java网络通信:UDP和TCP
  • 关于CDH以及HUE的介绍
  • vue-seo优化
  • Android构建流程与Transform任务
  • 题解:P13311 [GCJ 2012 Qualification] Speaking in Tongues
  • java面向对象-多态
  • 【前端】Power BI自动化指南:从API接入到Web嵌入
  • 旅游管理实训基地建设:筑牢文旅人才培养的实践基石
  • LeetCode热题100—— 238. 除自身以外数组的乘积
  • Pygame创建窗口教程 - 从入门到实践 | Python游戏开发指南