一个Apache Tomcat应用程序服务器,具有2个已配置的war应用程序和MessageSource异常

时间:2018-05-24 14:28:33

标签: java spring internationalization tomcat8

我有一个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明白它们是两个不同的来源? 还有哪些其他选择?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我建议尝试这项工作。

假设属性文件存储在项目的src/main/resources包中。请删除文件后缀.properties,以便只有messageBenumeratorB保留在messageSource.setBasenames("classpath:messageB", "classpath:enumaratorB");中并仔细检查文件路径和拼写。

如果你的属性文件在classpath中,请使用classpath*:否则Spring将在你的应用程序的web目录中查找属性。