Als JSF-Entwickler könnte es peinlich werden, wenn die folgende Fehlermeldung aus als folge einer Validierung aus dem Bildschirm erscheint:
Wert nicht göltig. Wie macht man dem Kunden klar, dass nicht unsere JSF-Anwendung schuld ist, sondern das teuer eingekaufte Portal (In unserem Fall der WebSphere-Portal-Server 6.1).
Der peinliche Fehler resultiert aus einer falschen Übersetzung der Fehlermeldungen der Referenzimplementierung von JSF 1.1 . Die Datei Messages_de.properties wurde von IBM 1:1 von der Referenzimplementierung übernommen.
javax.faces.component.UISelectOne.INVALID=Validierungs-Fehler: Wert nicht g\u00F6ltig.
javax.faces.component.UISelectMany.INVALID=Validierungs-Fehler: Wert nicht g\u00F6ltig.
Der Fehler war nicht so einfach zu finden, da die Übersetzungen in Unicode codiert sind.
\u00F6 ist ein kleines ö. Eine Volltextsuche durch die vorhandenen Jars führte deshalb nicht zum gewünschten Erfolg. Am Anfang dachte ich, es würde sich um einen Fehler in der IBM-Implementierung von JSF handeln. War es aber nur in direkt im Header (Kommentar) der Datei kann man erkennen, dass es sich um einen Fehler in der Referenzimplementierung handelt:
# Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
Der Schreibfehler befindet sich in der Datei Messages_de.properties. In meinem Fall (da wir die Implementierung von IBM verwenden befand sich diese Datei in websphere_apis-6.1.jar.
Um den Fehler zu fixen müsste man eigentlich die Datei "reparieren" oder man wendet den hier beschriebenen Work-Around an. Ein "reparieren" wäre dabei nicht so einfach möglich gewesen, da die JSF-Implementierung als Teil des WebSphere-Applikationsserver ausgeliefert wird. Durch eine "reparieren" könnte man den Server ernsthaft beschädigen. Also kam nur der Workaround in Frage.
1. Erstellung einer zusätzlichen Messages_de.properties (Enthält die 2 Keys mit der Korrektur)
2. Anpassung der faces-config.xml (deklaration eines zusätzlichen Message-Bundles.
<faces-config>
<application>
<message-bundle>de.nikem.jsf.Messages</message-bundle>
</application>
<locale-config>
<default-locale>de</default-locale>
</locale-config>
</faces-config>