My 2cts on software architecture, digital transformation, and other concerns

Dies ist der erste in einer Reihe von Blog-Posts über Spring Roo (Erläuterung siehe unten).
[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:
Damit Fehler in der Behandlung von Texten mit Sonderzeichen ausgeschlossen werden, sollte der "CharacterEncodingFilter" durchlaufen worden sein, bevor die Requestdaten in irgendeiner Form weiterverarbeitet werden.
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


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.

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.

Update 12.02.2011 23:50h:
  • Frage eingearbeitet: "Setzt Roo diese Einstellungen automatisch oder muss man diese selbst anpassen?" - siehe Fazit
  • verschiedene Verbesserungsvorschläge eingearbeitet und Tippfehler korrigiert

Tags

  • software development
  • java
  • spring
  • spring roo
  • special chars
  • tips
  • photooapp
  • open source

Updated: