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!