2015-03-25 104 views
4

我有問題配置Spring MessageSource忽略我的系統區域設置。當我使用null語言環境參數調用getMessage時,我希望我的MessageSource選擇默認屬性文件messages.properties。相反,它選擇messages_en.properties。當我將此屬性文件的名稱更改爲messages_fr.properties時,將選擇默認屬性文件。我的系統區域設置是'en'。所以看起來MessageSource忽略了我設置爲false的fallbackToSystemLocale屬性。春天MessageSource似乎忽略屬性fallbackToSystemLocale

此行爲與Spring 4.1.4以及4.1.5版本相同。

MessageSource的配置:

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="fallbackToSystemLocale" value="false"></property> 
    <property name="basenames"> 
     <list> 
      <value>locale/messages</value> 
     </list> 
    </property> 
    <property name="defaultEncoding" value="UTF-8"></property> 
</bean> 

獲得消息:

String message = messageSource.getMessage("user.email.notFound", new Object[] {email}, null); 

感謝您的諮詢!

回答

3

fallbackToSystemLocale旨在引導什麼消息源並當你調用他們locale=null

fallbackToSystemLocale控制,當你請求的消息(代碼)做什麼,不爲所要求的本地存在 - 無論是因爲沒有消息屬性的語言文件,同時,或只是因爲消息文件不包含消息代碼

在當你調用getMessagelocale=nullmessageSource.getMessage("key", null);),那麼區域將被設置另一方面

org.springframework.context.support.AbstractMessageSource:

protected String getMessageInternal(String code, Object[] args, Locale locale) { 
    ... 
    if (locale == null) { 
     locale = Locale.getDefault(); 
    } 
    ... 

fallbackToSystemLocale財產採取帳戶。

Therfore的easyest 破解 -arround(這是不是一個workarround這是一個黑客),將使用您不支持,而不是null語言: messageSource.getMessage("key", new Locale("XX"));

+0

感謝一個很好的答案。無論如何,你不覺得這種行爲不合邏輯嗎?我期望在提供空區域設置的情況下使用默認的消息屬性文件。如果我想使用系統本地,我會做'messageSource.getMessage(「key」,locale == null?Locale.getDefault():locale);''。即Wicket框架在我編寫時解決了這個問題,這對我來說似乎更好。 我可能會擴展'ResourceBundleMessageSource'類並覆蓋'getMessageInternal'來反映我的需求。如果它沒有被宣佈爲當然是最終的:) – 2015-03-25 12:57:30