无聊的传递水桶:Spring国际化时报NoSuchMessageException

用Spring ResourceBundle时,抛了异常:
org.springframework.context.NoSuchMessageException: No message found under code 'userlogin' for locale 'zh_CN'.
at org.springframework.context.support.DelegatingMessageSource.getMessage(DelegatingMessageSource.java:65)
at org.springframework.context.support.AbstractApplicationContext.getMessage(AbstractApplicationContext.java:646)

经过网搜,清一色的转帖解决方案:

写道
这样的错误。
总结一下,有可能由以下原因造成:
1.如果你使用eclipse创建的工程是class和src分开的,那么资源属性文件一定要放在src目录以内。
2.属性文件名的写法:
messages_zh_CN.properties (中文)
messages_en_US.properties (英文)
3.配置messageSource这个bean(注意:一定是messageSource不是messageResource ,这是Spring规定的)
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>messages</value>
</list>
</property>
</bean>
注意以上问题,就OK了。

 其实,上面的解决方案纯属瞎扯淡:
1.资源文件放在哪里,鬼才管你,爱放哪里放哪里,只要用时找的到;
2.资源文件命名规则的本质是:(你的资源文件可以是任意你喜欢的,比如msgResource)
     2.1 msgResource.properties 找不到对应的Locale时;
     2.2 msgResource_zh_CN.properties Locale为中文时;
     2.3 msgResource_en_US.propertise Locale为英文时;
     。。。支持其它语言请自行网搜,否则,就采用默认的msgResource.properties;
3.Spring Bean的id爱起啥名起啥名,鬼才管你。

那上面所说的异常到底是如何引起的呢?很简单,加载的资源文件位置不对。

下面是一个正确的样例(抛砖引玉,相信您看到懂):

<bean id="msgResource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
         <property name="basenames">
             <list>
			 <value>classpath:msg/yyTips</value>
			 <value>classpath:msg/ipTips</value>
	    </list>
         </property>
         <property name="cacheSeconds" value="-1"/>
    </bean>
    
    在msg目录下的资源文件有:
    yyTips.properties、yyTips_zh_CN.properties、yyTips_en_US.properties,可以根据需要加载其它语言支持

 

    顺便提及一下,get时出现中文乱码时,应当如何解决?
    最快、最直接的方法是用PropertiesEditor编辑属性文件,并将属性文件设置为ISO-8859-1编码,以便确保有效的将中文转为Unicode编码。
   
    附PropertiesEditor地址:http://propedit.sourceforge.jp/eclipse/updates/,至于eclipse安装该插件的方法,请自行网搜,很简单的。

你可能感兴趣的:(exception)