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

Avatar

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.

Über 1.000 Abonnenten sind up to date!

Die neuesten Tipps, Tricks, Tools und Technologien. Jede Woche direkt in deine Inbox.

Kostenfrei anmelden und immer auf dem neuesten Stand bleiben!
(Keine Sorge, du kannst dich jederzeit abmelden.)

Hiermit willige ich in die Erhebung und Verarbeitung der vorstehenden Daten für das Empfangen des monatlichen Newsletters der codecentric AG per E-Mail ein. Ihre Einwilligung können Sie per E-Mail an datenschutz@codecentric.de, in der Informations-E-Mail selbst per Link oder an die im Impressum genannten Kontaktdaten jederzeit widerrufen. Von der Datenschutzerklärung der codecentric AG habe ich Kenntnis genommen und bestätige dies mit Absendung des Formulars.

Kommentieren

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