Ich benutze JAXB2, um OXM in einem Spring-WS zu tun. Die angegebene XSD erfordert eine große XML-Datei, die an die Soap-Nachricht angehängt wird. Daher verwende ich MTOM, um die Datei zu übertragen, und habe MTOM auf meinem JAXB2Marshaller aktiviert.JAXB2 Mtom Anhang gebrochen von BOM
Wenn JAXB2 einen MTOM-Anhang mit einem erwarteten MIME-Typ von text/xml als Marshall-Objekt anlegt, wird dieses Element als javax.xml.transform.Source-Objekt bereitgestellt. Nach einiger Suche konnte ich herausfinden, wie ich dieses Source-Objekt an 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();
}
Das Problem, das ich habe, ist, dass, wenn ich sende UTF-8 kodierten Datei als Befestigungs ich die folgende Fehlermeldung erhalten:
[Fatal Error] :1:1: Content is not allowed in prolog.
ERROR: 'Content is not allowed in prolog.'
Dies wird durch eine Byte Order Mark vor verursacht wird des codierten Textes in der Datei, obwohl diese Stückliste nicht in einer UTF-8-codierten Datei benötigt wird, die nach dem Unicode-Standard zulässig ist, unterstützt Java keine Stücklisten in UTF-8-codierten Streams.
Ich kann dieses Problem lösen, indem ich eine Datei ohne die Stückliste sende, aber das ist nicht wirklich machbar, da es Probleme mit den meisten Microsoft-Produkten verursachen wird, die die Stückliste einfügen.
Es gibt viele Problemumgehungen für die Verweigerung von Sun/Oracle, dieses Problem mit den Streams zu beheben, aber sie erfordern alle Zugriff auf den Stream, das von JAXB2 bereitgestellte Source Object hat keinen InputStream, sondern nur ein Reader-Objekt . Gibt es eine Möglichkeit für mich, dieses Problem zu lösen, indem Sie entweder das Sources Reader-Objekt mit einem Lesegerät umschließen, das eine Stückliste in UTF-8-Codierung ignorieren kann, oder die Art und Weise ändern, in der JAXB2 den Anhang in die Quelle einliest die Stückliste in UTF-8-Codierung.
Vielen Dank im Voraus, Craig
Verwenden Sie Dezimal anstelle von Hex für Ihre Char-Konstanten ist * icky *. – dkarp
Danke für den Versuch blaise, leider habe ich das schon ausprobiert und es funktioniert nicht, der Leser, den meine Quelle enthält, implementiert keine Markierung. –
Hier kommt der BufferedReader zum Einsatz. Sie können Ihren Reader mit einem BufferedReader einpacken, um diese Fähigkeit zu erhalten: http://download.oracle.com/javase/6/docs/api/java/io/BufferedReader.html#markSupported%28%29 –