我正在使用JAXB2在Spring-WS中執行OXM。我指定的XSD需要將大型XML文件附加到soap消息,因此我使用MTOM傳輸文件並在我的JAXB2Marshaller上啓用了MTOM。JAXB2通過BOM破壞的Mtom附件
當JAXB2編組具有預期MIME類型的文本/ xml的MTOM附件時,它將該元素作爲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.'
這是由一個字節順序標記在前面所引起儘管在Unicode標準允許UTF-8編碼的文件中不需要此BOM,但Java不支持UTF-8編碼流中的BOM。
我可以通過發送一個沒有BOM的文件來解決這個問題,但這不是真的可行,因爲這會導致插入BOM的大多數Microsoft產品出現問題。
Sun/Oracle拒絕用Stream來解決這個問題有很多解決方法,但它們都需要你訪問Stream,JAXB2提供的Source對象沒有InputStream它只有一個Reader對象。有沒有一種方法可以解決這個問題,或者通過將Reader Reader對象與知道如何忽略UTF-8編碼中的BOM的閱讀器進行封裝或者改變JAXB2將附件讀入源代碼的方式,以便它可以忽略採用UTF-8編碼的BOM。
由於提前, 克雷格
對char常量使用十進制而不是十六進制是* icky *。 – dkarp 2011-01-18 16:18:36