Spring Boot+Thymeleaf国际化消息属性文件热重载不生效如何解决?
解决方案
1. 调整自定义MessageSource配置
你自定义重写了MessageSource,默认实现会缓存加载后的消息内容,且默认读取classpath下的编译后文件,需要改为使用ReloadableResourceBundleMessageSource,关闭缓存并直接读取源码目录下的国际化文件,示例配置如下:
@Bean public MessageSource messageSource() { ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); // 直接读取源码目录下的国际化文件,可根据你的实际文件前缀调整路径 messageSource.setBasename("file:src/main/resources/lang/message"); messageSource.setDefaultEncoding("UTF-8"); // 缓存时间设为0,每次获取消息都重新读取文件 messageSource.setCacheSeconds(0); messageSource.setFallbackToSystemLocale(false); return messageSource; }
注意:开发环境使用file路径读取源码文件仅用于本地调试,打包部署到生产环境前请切换为
classpath:lang/message路径并将cacheSeconds调整为合适的正值(比如3600),避免性能损耗和文件读取异常。
2. 补充devtools监听配置(可选)
如果你的业务逻辑需要服务重启才能生效,可以在application.yaml中添加devtools配置,让devtools检测到lang目录的改动时触发热重载:
spring: # 原有配置保留,新增以下内容 devtools: restart: # 额外监听lang目录的改动 additional-paths: src/main/resources/lang # 不需要触发重启的资源可以在这里排除 exclude: static/**,templates/**
3. 调整VSCode+Gradle开发配置
- 打开VSCode设置,开启
Java > Autobuild: Enabled选项,保证资源改动自动同步 - 如果你没有用上述的file路径直接读取源码,而是走classpath读取编译后的资源,可以在终端执行
gradle build --continuous启动Gradle持续构建模式,自动同步改动的资源文件到build目录。
修改国际化配置文件后等待1-2秒刷新页面,即可看到更新后的文案,无需重启服务。
内容的提问来源于stack exchange,提问作者Fabian
相关产品推荐
相关产品推荐

