我的messages.properties实际上是个大文件。 所以,我尝试将messages.properties中的一些属性移动到一个新文件,比如newmessages.properties和更新的spring bean配置xml,其中包含以下两个文件:
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:i18n/messages"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
<bean id="anotherMessageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:i18n/newmessages"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
但是,我无法访问新属性文件中定义的任何属性。 是否真的可以指定多个属性文件(对于单个语言环境)?
答案 0 :(得分:43)
基本名称(最后的s
)属性接受一个基本名称数组:
设置一个基本名称数组,每个基本名称遵循上述特殊约定。在解析消息代码时,将依次检查关联的资源包。
@see java doc:ReloadableResourceBundleMessageSource.setBasenames
所以你应该只有一个消息源,带有一个列表文件(尝试用逗号分隔它们)。
<bean id="anotherMessageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames" value="classpath:i18n/newmessages,classpath:i18n/messages"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
答案 1 :(得分:20)
另一种干净的方法:
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:messages1</value>
<value>classpath:messages2</value>
</list>
</property>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
答案 2 :(得分:1)
已经提到过的替代解决方案是使用属性parentMessageSource
,如果在当前实例中找不到它,则将消息查找委托给父级。
在您的情况下,最好继续使用basenames
数组。如果消息源使用不同的实现,则具有分层消息源可能更有意义。例如。第二个从db。读取消息。
请注意,在这种情况下,当Spring找到两个MessageSource
的实例时,主要的实例将是ID为messageSource
的实例。
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="parentMessageSource"><ref bean="anotherMessageSource"/></property>
<property name="basename" value="classpath:i18n/messages"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
<bean id="anotherMessageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:i18n/newmessages"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
答案 3 :(得分:0)
对于那些(像我一样),寻找java配置解决方案:
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("i18n/messages", "i18n/newmessages");
return messageSource;
}
答案 4 :(得分:0)
我已使用以下 bean 配置成功地将多个消息属性加载到 Spring Boot 应用程序中。
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource
= new ReloadableResourceBundleMessageSource();
messageSource.setBasenames("classpath:/messages/exception/messages",
"classpath:/messages/response/messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}