14.11.2011

Spring 3 - Internationalisierung mit der ResourceBundleMessageSource

Leichte Kost für den heutigen Abend. Die Verwaltung von internationalisierten Nachrichten mit Spring ist durch Dependency Injection einfach und komfortabel geworden. Das ApplicationContext Interface erweitert die bereits vorhandene Funktionalität des MessageSource Interface, welches den Zugriff auf das Resource Bundle bereitstellt.
Zur Verfügung stehen die folgenden Methoden:

 StringgetMessage(MessageSourceResolvable resolvable, Locale locale)
 StringgetMessage(String code, Object[] args, Locale locale)
 StringgetMessage(String code, Object[] args, String defaultMessage, Locale locale)

Wird der ApplicationContext geladen, wird automatisch nach einer MessageSource innerhalb des Context gesucht. Diese Bean muss den Namen 'messageSource' tragen, damit diese korrekt initialisiert werden kann. Alle Methodenaufrufe werden dann an die gefundene Bean delegiert. Sollte keine Bean mit diesem Namen gefunden werden, so wird in Oberklassen gesucht, oder eine leere DelegatingMessageSource erzeugt. In jedem Fall ist sichergestellt, dass die Methodenaufrufe delegiert werden.

Spring stellt zwei unterschiedliche Verwaltungsmöglichkeiten für Messages bereit. Zum einen die ResourceBundleMessageSource und zum anderen die StaticMessageSource. Für die Nutzung innerhalb einer Anwendung wird im Normalfall die ResourceBundleMessageSource eingesetzt, die StaticMessageSource dient im wesentlichen dem programmatischen Zugriff auf das Resource Bundle. Als Beispiel wird eine Bean mit dem Zugriff auf die MessageSource definiert.


Die Angabe des Messages Bundles erfolgt mit Berücksichtigung der Platzierung im Classpath:


Die Beans werden wie gewohnt entweder mit Annotationen, oder per XML Deskriptor definiert. In diesem Fall wurde die HelloWorld Bean mit einer Konfiguration per Annotation konfiguriert.


Der Zugriff auf das Resource Bundle erfolgt innerhalb der Bean über den ApplicationContext, der per Dependency Injection durch Spring initialisiert und verwaltet wird. In beiden Fällen wird eine Defaultmessage mitgegeben, welche ausgegeben wird, wenn die gewünschte Message nicht gefunden wird.

Der Test der Bean erfolgt durch einen einfachen JUnit Test, der mit dem Spring-Testrunner durchgeführt wird.

Wie man sieht, ist die Verwaltung per Spring denkbar einfach und bietet gegenüber dem direkten Zugriff auf den FacesContext einige Vorteile, die ausgenutzt werden können.

Der Beispielcode findet sich wie immer im Subversion.

Keine Kommentare:

Kommentar veröffentlichen