Mule+CXF haben Probleme mit Encodings in Anführungszeichen

Keine Kommentare

Nach einem Upgrade der Java Version auf 1.6.0.17 liefen unsere CXF basierten Webservice im Mule ESB nicht mehr.

Caused by: javax.xml.stream.XMLStreamException: java.io.UnsupportedEncodingException: "utf-8"
	at com.ctc.wstx.stax.WstxOutputFactory.createSW(WstxOutputFactory.java:257)
	at com.ctc.wstx.stax.WstxOutputFactory.createXMLStreamWriter(WstxOutputFactory.java:124)
	at org.apache.cxf.interceptor.StaxOutInterceptor.handleMessage(StaxOutInterceptor.java:67)
	... 25 more
Caused by: java.io.UnsupportedEncodingException: "utf-8"
	at sun.nio.cs.StreamEncoder.forOutputStreamWriter(StreamEncoder.java:42)
	at java.io.OutputStreamWriter.<init>(OutputStreamWriter.java:83)
	at com.ctc.wstx.stax.WstxOutputFactory.createSW(WstxOutputFactory.java:253)
	... 27 more

Auf den ersten Blick ist das merkwürdig, da utf-8 ein unterstütztes Encoding ist. Schaut man aber genauer hin stellt man fest daß die Anführungszeichen Teil des Encodings sein sollen. Dies funktioniert nicht. Laut Spezifikation ist dies zulässig, wenn aber meiner Meinung nach ungewöhnlich.
Diese Änderung ist Teil von JAX-WS 2.1.2.

Patchen lässt es sich aber leicht, wobei der Patch keinen Anspruch auf Vollständigkeit besitzt:

if (encoding != null && encoding.startsWith("\"") && encoding.endsWith("\"")) {
  encoding = encoding.substring(1, encoding.length() - 1);
}

Einzufügen ist dieser Code an zwei Stellen:

org.apache.cxf.interceptor.StaxInInterceptor#handleMessage()
nach
String encoding = (String)message.get(Message.ENCODING);
 
und
org.apache.cxf.interceptor.StaxInInterceptor#getEncoding()
vor
return encoding;

Die gepatchte Klasse sollte auf dem Classpath vor dem original liegen. Danach funktionieren die Webservices wieder.
Mittels eines kleinen UnitTests stell ich zudem sicher daß man nach einem CXF Fix/Upgrade testen kann ob dieses Verhalten nun sauber funktioniert.

Tags

Fabian Lange ist Lead Agent Engineer bei Instana und bei der codecentric als Performance Geek bekannt. Er baut leidenschaftlich gerne schnelle Software und hilft anderen dabei, das Gleiche zu tun.
Er kennt die Java Virtual Machine bis in die letzte Ecke und beherrscht verschiedenste Tools, die JVM, den JIT oder den GC zu verstehen.
Er ist beliebter Vortragender auf zahlreichen Konferenzen und wurde unter anderem mit dem JavaOne Rockstar Award ausgezeichnet.

Share on FacebookGoogle+Share on LinkedInTweet about this on TwitterShare on RedditDigg thisShare on StumbleUpon

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.