2017-11-21 2 views
0

Ich habe einen Java-Client für die Interaktion mit einem SOAP-Webservice mit Axis2 (1.7.6) als Codegenerator erstellt. Das Problem ist mit einigen Eingängen der Client eine Ausnahme mit der Meldung wirft:Axis2-Fehler: Ungültiges Leerzeichen (0x4) im Text zur Ausgabe

org.apache.axis2.AxisFault: Invalid white space character (0x4) in text to output (in xml 1.1, could output as a character entity)

Es scheint, der Serializer einige Zeichen trifft auf XML-Spezifikation als ungültig betrachtet. Ich habe dieses Problem gesehen, aber keine definitive Antwort oder die Lösung. Ich verwende nicht Spring oder ein anderes Framework zur Abhängigkeitsinjektion, es ist eine eigenständige Anwendung, daher muss ich die Inneres von Axis2 manuell konfigurieren.

Irgendwelche Ideen, wie man den Client richtig repariert/konfiguriert?

Antwort

1

Nach einigen Recherchen ich dieses Verhalten gefunden ist aufgrund einer Standardeinstellung des lib Woodstox (Axis2 Abhängigkeit), die die Klasse com.ctc.wstx.api.InvalidCharHandler.FailingHandler als Standardimplementierung der Schnittstelle com.ctc.wstx.api.InvalidCharHandler, verwendet innerhalb com.ctc.wstx.sw.XmlWriter und aufgerufen in der Serialisierung verwendet. Das bedeutet: Wenn die Komponente Zeichen trifft, die für XML als ungültig erachtet werden, wird ein Fehler ausgegeben.

Woodstox bietet eine andere Implementierung der Schnittstelle com.ctc.wstx.api.InvalidCharHandler, die com.ctc.wstx.api.InvalidCharHandler.ReplacingHandler genannt wird, die anstelle von Fehlern diese Zeichen für etwas anderes ersetzen wird. Aber wie geht das?

Die Klasse com.ctc.wstx.stax.WstxOutputFactory in Woodstox enthält mehrere Konfigurationen, von denen eine der ungültige Char-Handler ist. Allerdings ist es nicht durch eine magische Systemweit-Eigenschaft konfigurierbar, sondern durch die Methode com.ctc.wstx.stax.WstxOutputFactory#setProperty, die als Argumente eine Zeichenfolge und ein Objekt annimmt.

Also zuerst, werden Sie, dass die Fabrik erweitern müssen und legen Sie die Eigenschaft com.ctc.wstx.outputInvalidCharHandler mit einer Instanz von com.ctc.wstx.api.InvalidCharHandler.ReplacingHandler, die das Zeichen als Argument nimmt Sie mit der ungültigen ersetzen möchten. Wie folgt aus:

package my.package; 

import com.ctc.wstx.stax.WstxOutputFactory; 
public class MyWstxOutputFatory extends WstxOutputFactory { 

    public MyWstxOutputFatory() { 
     setProperty(
       com.ctc.wstx.api.WstxOutputProperties.P_OUTPUT_INVALID_CHAR_HANDLER, 
       new com.ctc.wstx.api.InvalidCharHandler.ReplacingHandler(' ')); 
    } 
} 

Die zweite, trickiest und undokumentierte Schritt ist, wie Sie Ihre Implementierung als Werk Woodstox'll Verwendung zu registrieren. Sie erhalten eine Datei mit dem Namen erstellen müssen META-INF/services/javax.xml.stream.XMLOutputFactory einfach den Namen Ihrer Fabrik enthält, in diesem Fall die Zeichenfolge:

my.package.MyWstxOutputFatory 

Platz diese Datei in einer solchen Art und Weise es in Ihrem Projekt resultierenden Glas enthalten ist. In meinem Fall habe ich platziert wie: src/main/resources/META-INF/services/javax.xml.stream.XMLOutputFactory.

Und du bist fertig!

Verwandte Themen