For an english summary see below...

Das Problem

Eher durch Zufall bin ich auf ein Problem aufmerksam gemacht geworden, dass manchmal dazu führte, dass in einem Webservice-Aufruf in der Übertragung Zeilenumbrüche von \r\n auf \n geändert wurden. Seltsamerweise trat dies bei dem Webservice nur bei gesendeten Daten auf; wenn Daten vom Server zurückgesendet wurden, waren diese in Ordnung. Sowohl auf dem Client als auch auf dem Server wurde JAX-WS in der Referenzimplementierung (Metro) von Java verwendet, so wie man es auch bekommt, wenn man Client und Server in NetBeans ohne weitere Webservice-Bibliotheken erstellt.

Die Fehlersuche

Bei Betrachtung eines Mitschnitts auf Netzwerkebene wurde schnell klar, dass in den Anfragen nicht 
 gefolgt von einem Zeilenumbruch stand, sondern eben nur der Zeilenumbruch. Da auch die Möglichkeit bestand, ähnliche Daten vom Server abzurufen, wurde auch dieses geprüft, und dort gab es keinen Fehler, das gewünschte \r\n wurde mittels 
 und Zeilenumbruch korrekt transportiert.

Eine Recherche in der XML-Spezifikation ergab, dass es durchaus ein spezielles Verhalten bei Zeilenumbrüchen gibt, wo z.B. der XML-Parser Zeilenumbrüche vereinfachen kann. Es sah auch so ein bisschen nach genau dieser Vereinfachung aus, allerdings ergab dies keinen Sinn, denn sie passierte noch auf dem Client, bei der Erzeugung der XML-Daten für den SOAP-Request. Hier war also gar kein Parser involviert, sondern die Serialisierung von Objekten nach XML.

Ein erster Verdächtiger

Die Serialisierung von JAX-WS RI erfolgt normalerweise mittels JAXB, das - wie JAX-WS - seit Java 6 mitgeliefert wird. Es schien so, als würde entweder nicht erkannt werden, dass der Wert der Zeichenkette in ein CDATA-Feld verpackt werden könnte, oder dass hier einfach so der Zeilenumbruch bereinigt wird.
Für den ersten Fall fanden wir keine Indizien, warum und ob überhaupt dies passieren sollte (und auch keinen Weg, dies auf einfache Weise zu beeinflussen), und der zweite Fall war ebenfalls unwahrscheinlich, weil es keinen Grund gab, diese Bereinigung bereits auf dem Client beim Erzeugen des XML vorzunehmen. Zudem verwendete der Server-Teil ebenfalls JAX-WS, und dort schien es ja zu funktionieren.

Kommisar Zufall hilft

Nach mehreren Versuchen, auch mit komplett neu angelegten Projekten, gab es plötzlich einen Fall, in dem alles funktionierte. Da aber viel rumprobiert und verschiedenste Clients und mehrere serverseitige Teile gegeneinander getestet wurden, war nicht sofort klar, welches Detail hier für eine funktionierende Variante verantwortlich war.

Bei genauerer Betrachtung ergab sich, dass es sich um einen Client handelte, der mit Java 7 ausgeführt wurde. Der gleiche Client unter Java 8 funktionierte jedoch nicht.

Ein Blick in den Mitschnitt der Übertragung zeige, dass Java 7 die JAX-WS Version 2.2.8 verwendet, Java 8 hingegen die JAX-WS Version 2.2.9

Eine kurze Suche auf der Webseite von JAX-WS RI ergab zudem, dass man die Version 2.2.9 derzeit gar nicht manuell herunterladen kann, im Gegensatz zu 2.2.8 und 2.2.10

Als Gegentest wurde dann noch einmal die Versionen 2.2.8 bzw. 2.2.10 manuell ins Client-Projekt eingebunden und dieses unter Java 8 laufen lassen - Ergebnis: dies funktioniert!

Ergebnis

Anscheinend hat die Version 2.2.9 von JAX-WS RI, so wie sie mit Java 8 kommt, ein Problem bei der Übertragung von \r\n.
Wenn man JAX-WS RI Version 2.2.8 oder 2.2.10 unter Java 8 manuell ins Projekt einbindet, funktionieren die Zeilenumbrüche wie gewünscht.

Workaround

Um nun doch mit Java 8 korrekte Webservice-Aufrufe hinzubekommen, scheint es ausreichend zu sein, JAX-WS RI Version 2.2.8 oder besser 2.2.10 herunterzuladen und alle JAR-Dateien von JAX-WS RI ins Projekt mit aufzunehmen. Die zugehörige Maven-Dependency dürfte groupId:com.sun.xml.ws artifactId:jaxws-rt version:2.2.10 sein.

Disclaimer

Das oben beschriebene Vorgehen bezieht sich ausschliesslich auf das Problem mit nicht korrekt umgewandelten Zeilenumbrüchen. Ich habe dies zwar in verschiedenen Varianten getestet, aber letztendlich ist nicht 100%ig auszuschliessen, dass durch obiges Vorgehen andere Probleme entstehen könnten. Deshalb sei dies nicht als allgemeingültiger Lösungsweg zu verstehen, sondern eher als fundierter Startpunkt für eigene Lösungen und Tests.

Artikel

A short description of the problem

When working with webservices based on JAX-WS RI we encountered the problem that client request were missing parts of line breaks inside the data: instead of \r\n only \n was submitted. The request was missing the 
 part of the data. This problem only occured on the client, the server was able to return the correct data which included all line break parts.

Diagnosis

By looking what exactly was transmitted in the request we found out that the client worked when running Java 7 while the same code did not work with Java 8. Turns out that Java 7 uses JAX-WS version 2.2.8, while Java 8 uses 2.2.9 (which is not available at the JAX-WS RI website).

Solution

The line break problem does not occur when using JAX-WS versions 2.2.8 or 2.2.10 under Java 8. To do so, go to the JAX-WS RI website and download one of both versions. Unzip the downloaded package and add all contained JAR files to your project.

Disclaimer

This workaround seems to work for our case with broken line breaks. However, it might cause other problems that we didn't come across. So, if you encounter the line break problem, use this suggestion as a solid starting point for your own solution. And of course, do some comprehensive testing.

Article (english summary)

Allgemeiner Disclaimer

Alle Angaben in diesem Text sind sorgfältig zusammengestellt und für einige Szenarien getestet worden. Trotzdem sind Fehler nicht auszuschliessen. Die Anwendung des Beschriebenen erfolgt deshalb immer auf eigene Gefahr.

Zusatzinfos
Navigation