2009年01月29日

JAXB2でBOM付きのXMLをWebクライアントへ出力

SAStruts→FlexへXMLを送信すると、Flexで↓のエラーが出る場合があります(不定期:3回に1回ぐらい)。
====================================================
HTTPService失敗
理由 : faultCode:Client.CouldNotDecode faultString:'Error #1088: ルートエレメントに続くドキュメントのマークアップは整形式でなければなりません。' faultDetail:'null'
====================================================
どうすりゃいいのよ?と思って色々調べてみると、XMLにBOMを付けると良いような情報があったので、実際にやってみると確かにエラーが起きなくなりました。

しかし、たまにエラーになるって・・・どういう処理をしているんだろう?っていうかバグ?

一応、BOMをつける方法を↓に書いておきます。

※clazzは、XML変換対象のクラス情報
 objは、XML変換対象のクラスのオブジェクト

HttpServletResponse httpServletResponse = ResponseUtil.getResponse();
httpServletResponse.setContentType("application/xml");
httpServletResponse.setCharacterEncoding("UTF-8");

// POJO -> XML 変換を行うマーシャラを生成
// clazzクラスをバインディングするコンテキストを生成
JAXBContext context = JAXBContext.newInstance(clazz);
Marshaller ma = context.createMarshaller();
ma.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
//ma.setProperty(Marshaller.JAXB_ENCODING , "UTF-8");

// POJO -> XML 変換して送信
OutputStream out = httpServletResponse.getOutputStream();

//BOMを付加します。
byte[] bom = {(byte)0xEF, (byte)0xBB, (byte)0xBF};
out.write(bom);

//XMLデータ本体を送信します。
ma.marshal(obj, out);

out.flush();
out.close();


posted by 台北猫々 at 20:06| Comment(0) | TrackBack(2) | 技術メモ(SAStruts)