私はSpring-WSでOXMを行うためにJAXB2を使用しています。私が指定したXSDは、大きなXMLファイルをSOAPメッセージに添付する必要があります。そのため、MTOMを使用してファイルを転送し、JAXB2MarshallerでMTOMを有効にしています。JAXB2 BOMで壊れたMtom添付ファイル
期待されるmimeタイプのtext/xmlを持つMTOM添付ファイルを整列すると、JAXB2はその要素をjavax.xml.transform.Sourceオブジェクトとして配信します。いくつかの検索の後、私はそのSourceオブジェクトをどのようにファイルに送ることができるかを知ることができました。
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();
}
私が午前問題は、私は添付ファイルとしてUTF-8でエンコードされたファイルを送信するとき、私は次のエラーを取得することです:
[Fatal Error] :1:1: Content is not allowed in prolog.
ERROR: 'Content is not allowed in prolog.'
これは前にバイトオーダーマークによって引き起こされていますこのBOMはUnicode標準で許可されているUTF-8エンコードファイルでは必要ありませんが、JavaはUTF-8エンコードストリームでBOMをサポートしていません。
この問題は、BOMのないファイルを送信することで解決できますが、BOMを挿入するほとんどのMicrosoft製品で問題が発生するため、これは実際には実現できません。
この問題をStreamsで修正することを拒否する回避策はたくさんありますが、Streamsにアクセスする必要があります.Source/Oracleが提供するSource ObjectにはReaderオブジェクトのみのInputStreamがありません。この問題を解決する方法はありますか?UTF-8エンコーディングでBOMを無視する方法を知っている読者にSources Readerオブジェクトをラップするか、またはJAXB2がソースに添付ファイルを読み込んで無視できるようにする方法を変更するUTF-8エンコーディングのBOM事前に
おかげで、 クレイグ
char定数に16進数の代わりに10進数を使用すると、* icky *です。 – dkarp
試してみてくれてありがとうございました、残念ながら私はすでにこれを試してみましたが、うまくいきません。私のソースには読者がマークを実装していません。 –
これは、BufferedReaderが再生する場所です。 ReaderをBufferedReaderでラップして、この機能を利用できます。http://download.oracle.com/javase/6/docs/api/java/io/BufferedReader.html#markSupported%28%29 –