ResourceBundleMessageSource的setBasename是否支持file前缀?JUnit测试报错
问题解答
核心结论
ResourceBundleMessageSource的setBasename方法不支持file:前缀,因为它的basename是基于类路径的资源束名称,而非文件系统路径,这就是你找不到对应key的直接原因。
原因分析
ResourceBundleMessageSource底层依赖Java原生的ResourceBundle实现,ResourceBundle只会从类路径下查找资源束文件,无法识别file:这种文件系统路径前缀,你的写法不符合它的资源加载逻辑,导致无法定位到目标文件。
正确配置方式
你的messages.properties位于src/main/resources/i18n/下,而src/main/resources是Maven/Gradle默认的类路径根目录,因此对应的类路径路径为i18n/messages,直接设置这个值作为basename即可:
AbstractResourceBasedMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasename("i18n/messages"); messageSource.setFallbackToSystemLocale(false); MessageSourceHolder.setMessageSource(messageSource);
JUnit测试环境下,Maven/Gradle默认会将src/main/resources下的资源纳入测试类路径,无需额外配置。
备选方案(若需加载文件系统资源)
如果确实需要直接加载文件系统中的资源文件,可以改用ReloadableResourceBundleMessageSource,它支持file:前缀的文件系统路径:
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); messageSource.setBasename("file:src/main/resources/i18n/messages"); messageSource.setFallbackToSystemLocale(false); MessageSourceHolder.setMessageSource(messageSource);
内容的提问来源于stack exchange,提问作者fernando1979
相关产品推荐
相关产品推荐

