Spring的MessageSource配置细节Spring的MessageSource有两个常用的实现ReloadableResourceBundleMessageSo
Spring的MessageSource配置细节
Spring的MessageSource有两个常用的实现
ReloadableResourceBundleMessageSource和
ResourceBundleMessageSource。这两个类在配置上有些区别。?我原来常用
ResourceBundleMessageSource,它的典型配置如下:???????? <bean id="messageSource"?
???????????????class="org.springframework.context.support.ReloadableResourceBundleMessageSource">?
? ? ? ? ? ? ? ? <property name="parentMessageSource" ref="bizMessageSource"/>?
??????????????? <property name="basenames">?
? ? ? ? ? ? ? ? ? ? ? ? <list>?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <value>resources.cls-web-resources</value>?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <value>resources.cls-web-resources-definitions</value>?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <value>resources.cls-web-resources-menu</value>
??????????????????????? </list>?
? ? ? ? ? ? ? ? </property>?
? ? ? ? </bean>?在比较一下
ReloadableResourceBundleMessageSource的配置:<bean id="messageSource"?
???????????????class="org.springframework.context.support.ReloadableResourceBundleMessageSource">?
? ? ? ? ? ? ? ? <property name="parentMessageSource" ref="bizMessageSource"/>?
? ? ? ? ? ? ? ? <property name="fallbackToSystemLocale"><value>false</value></property>?
? ? ? ? ? ? ? ? <property name="basenames">?
? ? ? ? ? ? ? ? ? ? ? ? <list>?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <value>
classpath:resources
/cls-web-resources</value>?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <value>
classpath:resources
/cls-web-resources-definitions</value>?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <value>
classpath:resources
/cls-web-resources-menu</value>??
??????????????????????? </list>?
? ? ? ? ? ? ? ? </property>?
? ? ? ? </bean>?原因在于
ReloadableResourceBundleMessageSource的内部使用DefaultResourceLoader来装载ResourceBundle,而
ResourceBundleMessageSource内部是直接使用java.util.ResourceBundle.
getBundle(String?baseName,?Locale?locale,?ClassLoader?loader)?来获取i18n文件信息的,而ResourceBundle是使用“.”来作为
basename分隔符的(这也是我们常用的形式),所以很前面的配置有些区别。?另外如果你不设置“
fallbackToSystemLocale”的话,那么当你传入的Locale是null或者ResourceBundle没有该Locale的配置文件的话,那么会返回Locale.getDefault()的Locale下的
Message。
该设置默认为True,也就是说,如果找不到相应的ResourceBundle,系统始终会显示为中文的
Resource,
建议关掉该设置,否则fallBackLocale久没有什么意义了。?另外还有一个有用的设置“
useCodeAsDefaultMessage”,
默认为false,这样当Spring在ResourceBundle中找不到messageKey的话,就抛出NoSuchMessageException,把它设置为True,则找不到不会抛出异常,而是使用messageKey作为返回值。