[english version]
Problem: Sonderzeichen und Umlaute werden in meiner Roo-Anwendung nicht korrekt angezeigt
Im Spring Roo-Forum gibt es öfter Anfragen, die o.g. Problem beschreiben, dass deutsche Umlaute wie ä, ö, ü und ß nicht korrekt gespeichert oder "kaputt" übertragen werden. Im Folgenden möchte ich kurz die häufigsten Fehlerquellen und Lösungen aufzeigen.
Zeichensatz der HTML-/ JSP-Seite
Durch Roo generierte JSPs werden immer im Zeichensatz UTF-8 ausgeliefert. Schreibt man eigene JSPs bspw. mit Formularen, sollte diese HTML bzw. JSP-Seite als Zeichensatz ebenfalls UTF-8 verwenden. Dies erreicht man in dem am Anfang der JSP die folgende Zeile eingefügt wird:<jsp:directive.page contenttype="text/html;charset=UTF-8" pageencoding="UTF-8"/>
Am Anfang der "default.jspx", die über Apache Tiles als "Rahmen" für alle anderen JSP-Seiten gilt, sind z.B. folgende Angaben zum Encoding/ Zeichensatz enthalten:
<html xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tiles="http://tiles.apache.org/tags-tiles" xmlns:spring="http://www.springframework.org/tags" xmlns:util="urn:jsptagdir:/WEB-INF/tags/util" > <jsp:output doctype-root-element="HTML" doctype-system="about:legacy-compat" /> <jsp:directive.page contentType="text/html;charset=UTF-8" /> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <!-- ... -->
Ist sichergestellt, dass die Seiten im Zeichensatz "UTF-8" ausgeliefert werden (dies kann im Browser meist im Menüpunkt "Ansicht > Zeichensatz" kontrolliert werden), die Sonderzeichen werden aber trotzdem falsch übertragen, ist dies nicht die Fehlerursache.
CharacterEncodingFilter in der web.xml
Dieser Punkt ist der häufigste Fehler. Es geht hierbei um die Reihenfolge der <filter-mapping>-Tags in der Datei "web.xml". Diese Tags geben an, in welcher Reihenfolge die einzelnen Filter bei einem HTTP-Request durchlaufen werden.Roo generiert leider erst seit Version 1.1.1 per Default die korrekte Reihenfolge, wie folgt aussieht:
<filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Spring OpenEntityManagerInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>HttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Will man die Reihenfolge der Filter ändern, ist es wichtig, deren Bedeutung zu verstehen:
- CharacterEncodingFilter - Setzt den Zeichensatz des Requests, falls der Browser ihn nicht mitsendet
- OpenEntityManagerInViewFilter - nur in Verbindung mit Hibernate, setzt EntityManager in ThreadLocal (siehe Diskussion über Vor- und Nachteile)
- HttpMethodFilter - Notwendig um bspw. PUT oder DELETE abbilden zu können
- springSecurityFilterChain - muss nach HttpMethodFilter kommen, wenn auf HTTP-Method eingeschränkt wird
- ... ggf. weitere Filter
Aus diesem Grund lautet die Empfehlung: das <filter-mapping> für den CharacterEncodingFilter muss in der "web.xml" an erster Stelle stehen (Erklärung siehe ROO-1698)!
Datenbankverbindung
Zu guter Letzt sollte sichergestellt werden, dass auch die Kommunikation mit der Datenbank über Unicode bzw. mit dem Standardzeichensatz UTF-8 geführt wird.Kommt als Datenbank bspw. MySQL zum Einsatz, generiert Roo automatisch die Unicode-Unterstützung über folgende Konfiguration in der Datei "src/main/resources/META-INF/spring/database.properties":
database.url=jdbc:mysql://[YOUR_DB_SERVER]:3306/[YOUR_DB_NAME]?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
Fazit
Seit Version 1.1.1 verfügt Spring Roo über eine (bisher) fehlerfreie Unterstützung für Sonderzeichen, die bereits in diversen Sprachen getestet wurde.Bei Fragen und Problemen findet man im Roo-Forum auf jeden Fall kompetente Hilfe.
Im Text verwendete, weiterführende Links
- ROO-JIRA issues
- https://jira.springsource.org/browse/ROO-89
- https://jira.springsource.org/browse/ROO-1030
- https://jira.springsource.org/browse/ROO-1585
- https://jira.springsource.org/browse/ROO-1684
- https://jira.springsource.org/browse/ROO-1698
- https://jira.springsource.org/browse/ROO-1731
- Threads im ROO-Forum
- http://forum.springsource.org/showthread.php?t=101926
- http://forum.springsource.org/showthread.php?t=97672
- Sonstige
Spring Roo ist ein Code-Generierungs-Werkzeug für die Softwareentwicklung, welches Entwickler in die Lage versetzt schnell und unkompliziert vorzeigbare Ergebnisse bspw. in Form von benutzbaren Prototypen zu liefern. Im Gegensatz zu anderen Werkzeugen, Frameworks und Tools entwickelt man mit Spring Roo zu 100% in Java.Update 12.02.2011 23:50h:
Für die Anpassung oder Erweiterung von Roo bspw. durch eigene Add-Ons kann auf vorhandenes Java-Wissen und -Erfahrung aufgebaut werden. Unterstützt durch die geringen Einstiegshürden und die hohe Modularisierung, kann so jedes Projekt leicht an die ganz speziellen, individuellen Bedürfnisse angepasst und einmal geschriebene Komponenten oder Add-Ons wiederverwendet werden.
- Frage eingearbeitet: "Setzt Roo diese Einstellungen automatisch oder muss man diese selbst anpassen?" - siehe Fazit
- verschiedene Verbesserungsvorschläge eingearbeitet und Tippfehler korrigiert
super, hat mir sehr geholfen.
AntwortenLöschenGRüsse Stefan