Spring的MessageSource配置细节
2006-05-22
1,192 views
暂无评论
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>
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>
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作为返回值。


Twitter
Google Profile
Picasa Web Album
Google Reader
Flickr
豆瓣网
有话请说,有屁请憋住!