Ich verwende JAXB2, um OXM in einem Spring-WS durchzuführen. Die XSD, die ich spezifiziert habe, erfordert eine große XML-Datei, die an die Soap-Nachricht angehängt werden muss, also verwende ich MTOM, um die Datei zu übertragen, und habe MTOM auf meinem JAXB2Marshaller aktiviert.
Wenn JAXB2 einen MTOM-Anhang mit dem erwarteten Mime-Type text/xml marshallt, wird dieses Element als javax.xml.transform.Source-Objekt geliefert. Nach einiger Suche konnte ich herausfinden, wie ich dieses Source-Objekt in eine Datei senden kann.
final Source source = request.getSource();
StreamSource streamSource = (StreamSource) source;
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
File file = new File ("/tempxmlfile.xml");
try{
transformer.transform(streamSource, new StreamResult(file));
LOG.info("File saved in "+file.getAbsolutePath());
}
catch(Exception ex){
ex.getMessage();
}
Wenn ich eine UTF-8-kodierte Datei als Anhang sende, erhalte ich folgende Fehlermeldung:
[Fatal Error] :1:1: Content is not allowed in prolog.
ERROR: 'Content is not allowed in prolog.'
Dies wird durch ein Byte Order Mark vor dem kodierten Text in der Datei verursacht. Obwohl dieses BOM in einer UTF-8 kodierten Datei nicht erforderlich ist, ist es nach dem Unicode-Standard zulässig, Java unterstützt jedoch keine BOMs in UTF-8 kodierten Streams.
Ich kann dieses Problem lösen, indem ich eine Datei ohne die Stückliste sende, aber das ist nicht wirklich machbar, da es bei den meisten Microsoft-Produkten, die die Stückliste einfügen, zu Problemen führen würde.
Es gibt viele Workarounds für Sun/Oracle's Weigerung, dieses Problem mit den Streams zu beheben, aber sie alle erfordern, dass Sie Zugriff auf den Stream haben, das Source-Objekt, das von JAXB2 bereitgestellt wird, hat keinen InputStream, es hat nur ein Reader-Objekt. Kann ich dieses Problem lösen, indem ich entweder das Reader-Objekt der Quelle mit einem Reader umhülle, der ein BOM in UTF-8-Kodierung ignorieren kann, oder indem ich die Art und Weise ändere, wie JAXB2 den Anhang in die Quelle einliest, so dass es das BOM in UTF-8-Kodierung ignorieren kann?
Vielen Dank im Voraus, Craig