当前位置: 首页 > 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.lryc.cn/news/591855.html

相关文章:

  • 栈和队列的题目,咕咕咕
  • Python基础--嵌套循环
  • 尚庭公寓----------分页查询
  • 【人工智能99问】梯度消失、梯度爆炸的定义、后果及规避手段?(7/99)
  • 树莓派Qt 安装
  • 数据结构 栈(1)
  • 常用API
  • 【深度学习新浪潮】AI在finTech领域有哪些值得关注的进展?
  • Redis中什么是看门狗机制
  • Paimon 动态分桶
  • 大型语言模型的白日梦循环
  • 【软件测试】软件测试分类与方法解析:目标到工具
  • LINUX例行性工作(计划任务)实验操作 ---at和crontab以及系统级别的计划任务
  • Python学习之——序列化与反序列化
  • 链路聚合实训
  • 解决 MyBatis/MyBatis-Plus 中 UUID 类型转换错误的最佳实践
  • MS Project替代方案:5款项目管理工具测评,8Manage PM为何更优?
  • vue svg实现一个环形进度条组件
  • 进程终止机制详解:退出场景、退出码与退出方式全解析
  • STM32 IAR 生成工程后配置
  • 时序数据库选型指南︰为什么IoTDB成为物联网场景首选?
  • UML用例规范,use case diagram
  • halcon 检测直线
  • OpenCV学习笔记二(色彩空间:RGB、HSV、Lab、mask)
  • DocsGPT:您的智能知识助手,解锁高效信息检索
  • 前端之HTML学习
  • 项目实战(18)-POE分离器
  • 渗透总结一
  • 手机兼容测试服务提供商对比分析:如何选择最合适的测试平台
  • 学习软件测试掌握什么基本知识?