我有一个Apache Tomcat应用服务器,版本为8.5.30,并且它上面配置了2个Web应用程序。
这些应用程序具有Spring Framework 5,每个应用程序都有自己的ReloadableResourceBundleMessageSource,因为我使用了消息的国际化(i18n)。
当我启动Apache并加载其中一个站点时,首先打开的站点将其消息加载到内存中,而当我打开时,第二个站点没有加载其消息。因此,这会在第二个应用程序上导致异常消息,并抛出异常,如:
引起:org.springframework.context.NoSuchMessageException: 在代码'menu.login'下找不到区域设置'en_US'的消息。
为了尝试解决这个问题,我尝试创建两个不同的MessagesSource,每个应用程序一个,但是当加载应用程序服务器时,抛出了另一个异常:
引起: org.springframework.beans.factory.NoUniqueBeanDefinitionException:没有 [org.springframework.context.MessageSource]类型的限定bean是 已定义:预期的单个匹配bean但找到2:messageSourceA, messageSourceB。
关于我如何尝试的一些示例
ROOT.war中的AppA(别名1)
@Bean
public MessageSource messageSourceA() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasenames("classpath*:messageA", "classpath*:enumaratorA");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
ROOT.war中的AppB(别名2)
@Bean
public MessageSource messageSourceB() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasenames("classpath*:messageB", "classpath*:enumaratorB");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
拜托,你能帮我解决这个问题吗? 我怎样才能让Apache / Spring明白它们是两个不同的来源? 还有哪些其他选择?
提前致谢。
答案 0 :(得分:0)
我建议尝试这项工作。
假设属性文件存储在项目的src/main/resources
包中。请删除文件后缀.properties
,以便只有messageB
和enumeratorB
保留在messageSource.setBasenames("classpath:messageB", "classpath:enumaratorB");
中并仔细检查文件路径和拼写。
如果你的属性文件在classpath中,请使用classpath*:
否则Spring将在你的应用程序的web目录中查找属性。