2016-04-23 7 views
1

So in Thymeleaf + Spring (not Boot) - how to show messages from messageSourceWarum Thymeleaf International arbeitet nur mit ResourceBundleMessageSource

Ich fand diese Frage beantworten helfen, dass, wenn Sie die ReloadableResourceBundleMessageSource verwenden würde es nicht funktioniert. Thymoleaf würde anzeigen? App.name_pt_BR ?? anstelle des erwarteten Ergebnisses.

@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; 
} 

Wenn ich nach unten umschalten, funktionierte es wie erwartet.

@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; 
} 

Warum kann die ReloadableResourceBundleMessageSource nicht verwendet werden?

Hinzufügen von Code für diese Frage: GitHub

+0

Kann das Problem mit XML-basierter Konfiguration zu reproduzieren. Beispielanwendung verfügbar auf [Github] (https://github.com/manish-in-java/stackoverflow-questions/tree/master/36816274). Etwas scheint mit der Java-basierten Konfiguration nicht zu funktionieren. Es gibt [andere Beispiele] (https: //samerabdelkafi.wordpress.com/2014/08/03/spring-mvc-full-java-based-config /) mit Java-Konfiguration, die 'ReloadableResourceBundleMessageSource' erfolgreich verwendet. – manish

+0

Interessant ... Ich sehe, wo Sie Thymeleaf verwenden, aber das Beispiel, das Sie verknüpften, ist nicht. Beide verwenden jedoch Spring Boot nicht. Ich unter, wenn das ist, wo das Problem ist. – ndrone

+0

Es könnte sich lohnen, ein Problem im Spring Github Repo zu stellen. – manish

Antwort

1

die Antwort gefunden!

Per den javadocs für ReloadableResouceBundleMessageSource

Frühling spezifische Message Implementierung, die Ressourcenbündel mit bestimmten Basisnamen zugreift, im Frühjahr Applicationressourcenbelastung teilnehmen. Im Gegensatz zur JDK-basierten ResourceBundleMessageSource verwendet diese Klasse Eigenschaftsinstanzen als benutzerdefinierte Datenstruktur für Nachrichten und lädt sie über eine PropertiesPersister-Strategie aus Spring Resource-Handles. Diese Strategie ist nicht nur in der Lage, Dateien basierend auf Zeitstempeländerungen neu zu laden, sondern auch Eigenschaftendateien mit einer bestimmten Zeichencodierung zu laden. Es wird auch XML-Eigenschaftendateien erkennen.

Beachten Sie, dass die als "basennames" -Eigenschaft festgelegten Basisnamen in einer etwas anderen Weise behandelt werden als die Eigenschaft "basenames" von ResourceBundleMessageSource. Es folgt der grundlegenden ResourceBundle-Regel, Dateierweiterungen oder Sprachcodes nicht anzugeben, kann sich jedoch auf jeden Spring-Ressourcenspeicherort beziehen (statt auf Klassenpfadressourcen beschränkt zu sein). Mit einem Präfix "classpath:" können weiterhin Ressourcen aus dem Klassenpfad geladen werden, aber "cacheSeconds" -Werte, die nicht "-1" sind (Caching für immer), funktionieren in diesem Fall möglicherweise nicht zuverlässig.

Für eine typische Webanwendung könnten Nachrichtendateien in WEB-INF platziert werden: z. ein "WEB-INF/messages" Basisname würde eine "WEB-INF/messages.properties", "WEB-INF/messages_de.properties" usw. Anordnung sowie "WEB-INF/messages.xml", "WEB-INF /messages_en.xml "usw. Beachten Sie, dass Nachrichtendefinitionen in einem vorherigen Ressourcenpaket die eines späteren Pakets aufgrund sequenzieller Suche überschreiben.

Diese MessageSource kann einfach außerhalb eines ApplicationContext verwendet werden: Sie verwendet standardmäßig einen DefaultResourceLoader, der einfach mit dem Resource Loader des ApplicationContext überschrieben wird, wenn er in einem Kontext ausgeführt wird. Es hat keine anderen spezifischen Abhängigkeiten.

so ist die Lösung, den Pfad bereitzustellen.

von

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

zu includeing den Pfad auf 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

aber es funktioniert nicht, ich habe es versucht. Wenn Sie ein vollständiges Beispiel haben, bitte mit uns. – Muhammad

+0

Welche Version von Thymeleaf und Spring Boot? Dies funktionierte mit Thymeleaf 2.1.x und Spring Boot 1.3.x – ndrone

+0

Nun, ich benutze Thymleaf 3.0.0 und spring-web 4.3.4 – Muhammad

Verwandte Themen