2016-04-23 16 views
1

工程,以便幫助回答這個問題Thymeleaf + Spring (not Boot) - how to show messages from messageSource爲什麼Thymeleaf國際只ResourceBundleMessageSource會

我發現,如果你使用ReloadableResourceBundleMessageSource就不會工作。 Thymeleaf會顯示?? app.name_pt_BR ??而不是預期的結果。

@Bean(name = "messageSource") 
public MessageSource messageSource() { 

    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); 
    messageSource.setBasename("/i18n/messages"); 
    messageSource.setFallbackToSystemLocale(false); 
    messageSource.setCacheSeconds(0); 
    messageSource.setDefaultEncoding("UTF-8"); 

    return messageSource; 
} 

當我切換到下面它按預期工作。

@Bean(name = "messageSource") 
public MessageSource messageSource() { 

    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); 
    messageSource.setBasename("/i18n/messages"); 
    messageSource.setFallbackToSystemLocale(false); 
    messageSource.setCacheSeconds(0); 
    messageSource.setDefaultEncoding("UTF-8"); 

    return messageSource; 
} 

爲什麼ReloadableResourceBundleMessageSource無法使用?

添加代碼這個問題:GitHub

+0

無法路徑以基於XML配置重現該問題。示例應用程序在[Github]上可用(https://github.com/manish-in-java/stackoverflow-questions/tree/master/36816274)。基於Java的配置似乎沒有什麼用處。還有[其他示例](https://samerabdelkafi.wordpress。com/2014/08/03/spring-mvc-full-java-based-config /)使用'ReloadableResourceBundleMessageSource'成功使用Java配置。 – manish

+0

有趣......我看到你在哪裏使用Thymeleaf,但你鏈接的例子不是。但是兩者都沒有使用Spring Boot。如果這就是問題所在,我就置之不理。 – ndrone

+0

可能值得在Spring Github回購中提出一個問題。 – manish

回答

1

找到了答案!

每的Javadoc ReloadableResouceBundleMessageSource

,使用指定的基本名稱,參與Spring的ApplicationContext的資源加載訪問資源包Spring特定的MessageSource的實現。 與基於JDK的ResourceBundleMessageSource相比,此類使用Properties實例作爲其消息的自定義數據結構,並通過Spring Resource句柄中的PropertiesPersister策略加載它們。這種策略不僅能夠根據時間戳更改重新加載文件,而且能夠使用特定的字符編碼加載屬性文件。它也會檢測XML屬性文件。

請注意,設置爲「basenames」屬性的基名稱與ResourceBundleMessageSource的「basenames」屬性稍有不同。它遵循不指定文件擴展名或語言代碼的基本ResourceBundle規則,但可以引用任何Spring資源位置(而不限於類路徑資源)。使用「classpath:」前綴,仍然可以從類路徑加載資源,但在此情況下,除「-1」(永久緩存)之外的「cacheSeconds」值可能無法可靠地工作。

對於典型的Web應用程序,消息文件可以放入WEB-INF:例如一個「WEB-INF/messages」基本名稱可以處理一個「WEB-INF/messages.properties」,「WEB-INF/messages_en.properties」等排列以及「WEB-INF/messages.xml」,「WEB-INF /messages_en.xml「等。請注意,由於順序查找,先前資源束中的消息定義將覆蓋較晚束中的消息定義。

該MessageSource可以很容易地在ApplicationContext之外使用:它將使用DefaultResourceLoader作爲默認值,如果在上下文中運行,只需使用ApplicationContext的資源加載器重寫即可。它沒有任何其他特定的依賴關係。

所以修復是提供路徑。

@Bean 
public MessageSource messageSource() 
{ 
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); 
    messageSource.setBasename("messages"); 
    messageSource.setFallbackToSystemLocale(false); 
    messageSource.setCacheSeconds(0); 
    messageSource.setDefaultEncoding("UTF-8"); 
    return messageSource; 
} 

到includeing上setBasename()

@Bean 
public MessageSource messageSource() 
{ 
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); 
    messageSource.setBasename("classpath:messages"); 
    messageSource.setFallbackToSystemLocale(false); 
    messageSource.setCacheSeconds(0); 
    messageSource.setDefaultEncoding("UTF-8"); 
    return messageSource; 
} 
+0

但我沒有嘗試過。如果你有完整的例子,請與我們聯繫。 – Muhammad

+0

什麼版本的百里香和春季啓動?這與Thymeleaf 2.1.x和春季啓動1.3.x – ndrone

+0

以及我使用Thymleaf 3.0.0和spring-web 4.3.4 – Muhammad