Spring的MessageSource配置细节

Spring的MessageSource有两个常用的实现 ReloadableResourceBundleMessageSourceResourceBundleMessageSource。这两个类在配置上有些区别。
 
我原来常用 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作为返回值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring框架提供了很好的国际化(i18n)支持,其核心是ResourceBundleMessageSource类,这个类实现了MessageSource接口,可以通过其提供的方法获取国际化的消息文本。国际化配置包含以下步骤: 1. 在Spring配置文件中配置ResourceBundleMessageSource Bean。 2. 创建属性文件,包含不同语言版本的消息文本。 3. 在JSP页面或者Java代码中使用MessageSource获取对应语言版本的消息文本。 具体操作如下: 1. 在Spring配置文件中添加如下配置: ``` <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="messages"/> </bean> ``` basename属性指定了消息文件的基础名称,这里的值是“messages”,表示消息文件名为“messages.properties”(默认语言)和“messages_zh_CN.properties”(中文语言)。 2. 创建消息文件。 在classpath下创建一个名为“messages.properties”的文件,内容如下: ``` message.hello=Hello, World! ``` 然后在同一个目录下创建一个名为“messages_zh_CN.properties”的文件,内容如下: ``` message.hello=你好,世界! ``` 这里我们定义了一个名为“message.hello”的消息文本,分别提供了英文和中文两种语言版本。 3. 在JSP页面或者Java代码中使用MessageSource获取对应语言版本的消息文本。 在JSP页面中,可以使用spring:message标签获取消息文本: ``` <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <spring:message code="message.hello"/> ``` 在Java代码中,可以注入MessageSource,并使用其getMessage方法获取消息文本: ``` @Autowired private MessageSource messageSource; String message = messageSource.getMessage("message.hello", null, Locale.getDefault()); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值