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 |
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);
} |
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; |
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.