Multiple MessageBundles in JSF ManagedBeans

In einer bestehenden Web-Applikation, mit MyFaces 1.1.5 wollte ich aus einer MessageBean auf verschiedene MessageBundles zugreifen. Die betroffene Klasse erbt von der BaseBean, welche folgende Methode zur Verfügung stellt:

public String getStringFromResourceBundle(final String key) {
    return ResourceBundle.getBundle(getApplication().getMessageBundle()).getString(key);
}

Die faces-config habe ich um zwei weitere ResourceBundles erweitert.

<application>
 <default-render-kit-id>org.apache.myfaces.trinidad.core</default-render-kit-id>
 <variable-resolver>
     org.springframework.web.jsf.DelegatingVariableResolver
 </variable-resolver>
 <locale-config>
     <default-locale>de</default-locale>
 </locale-config>
 <message-bundle>
     de.itservices.onlineservices.resources.gui.status
 </message-bundle>
 <message-bundle>
     de.itservices.onlineservices.resources.gui.buildno
 </message-bundle>
 <message-bundle>
     de.itservices.onlineservices.resources.gui.messages
 </message-bundle>
</application>

In der betroffenen Klasse habe ich über die Methode aus der BaseBean eine Property aufgerufen dien in der status.properties hinterlegt ist. Der Aufruf endete in einer MissingResourceException.

java.util.MissingResourceException: Can't find resource for bundle java.util.PropertyResourceBundle, key Revision

Wenn mehrere message-bundles in der faces-config eingetragen sind, wird in der Implementierung von MyFaces 1.1.5 der letzte Eintrage genommen. Properties aus den ersten beiden message-bundles stehen nicht zur Verfügung.
Soll in einer ManagedBean auf mehr als auf eine message-bundle/Properties zugegriffen werden, muss der Zugriff erst implementiert werden. Hier eine mögliche Lösung.

URL url = this.getClass().getClassLoader().getResource("de/firma/projekt/resources/buildno.properties");
String path = url.getPath().replaceAll("%20", " ");
Properties prop = new Properties();
prop.load(new FileInputStream(path));
String zeit = prop.getProperty("Time");

Die zweite Zeile ist ein Workaround für Pfade mit Leerzeichen auf Windows-Systemen, aber das ist ein anderes Thema.
Ich habe mir die JSF 1.2 Spezifikation heruntergeladen und dannach durchsucht. Die Spez. ist zu diesem Thema nicht transparent, sie sagt nichts darüber aus, was geschehen soll wenn mehrere message-bundles in der faces-config.xml eingetragen sind und aus einer ManagedBean versucht wird darauf zuzugreifen. Es waere natuerlich schoen wenn die Methode getApplication().getMessageBundle() einen MessageBundle zurueckgeben wuerde der die Properties aus allen MessageBundles enthaelt die in der faces-config.xml eingetragen sind.

3 thoughts on “Multiple MessageBundles in JSF ManagedBeans

  1. Hallo aus Berlin,

    habe gerade dasselbe Problem. Bisher hatte ich nur JSF2 und Trinidad in Verwendung. In der Faces_config hatte ich 3 bundles und das funktionierte auch einwandfrei. Habe nun noch Tomahawk hinzugefügt und laufe auf dasselbe Problem.

    Gibt es da evtl. inzwischen eine andere Lösung?

    Danke.

    Bye

    US

  2. Hi Uwe,

    ich weis es nicht genau. Ich befasse mich nicht mehr JSF. Ich bin zu Ruby on Rails konvertiert.
    Meiner Ansicht nach ist Ruby on Rails einfach viel besser fuer Webdentwicklung geeignet als JSF.

    Wenn du keine elegante Loesung findest dann benutz einfach diese Interface aus Spring:
    org.springframework.context.MessageSourceAware
    Damit muesste es gehen.

    Wuensche dir viel Erfolg mit dem JSF Projekt.

    Gruss,
    Robert

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s