道場cometdのJavaクライアントに応答をデコードするための適切な方法
質問
私は道場のcometdチャネルを使用して、前後に任意XMLEncodedのJavaオブジェクトをプッシュしたい、と私は適切にペイロードをデコードする問題を持っています。
これを行うために、私はチャットルームクライアントのデモプログラムのストリップダウンバージョンでは、このsendメソッドを持っています
private void send(String string) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("intArray", new int[] {1});
ByteArrayOutputStream baos = new ByteArrayOutputStream();
XMLEncoder xmlEncoder = new XMLEncoder(baos);
xmlEncoder.writeObject(map);
xmlEncoder.close();
Map<String, Object> encodedMap = new HashMap<String, Object>();
try {
String encoded = baos.toString("UTF-8");
encodedMap.put("xmlpayload", encoded);
} catch (Exception e) {
throw new RuntimeException("could not use UTF-8", e);
}
bayreuxClient.publish("/prototype/a", encodedMap, String.valueOf(System.currentTimeMillis()));
}
今のUTF-8でエンコードされたバイトストリーム(私はあまりにもエンコーディングの世話をする必要が承知していますが、それは今問題ではありません)。
に平坦化されたXMLスニペットを作成しますこのメッセージ受付リスナーは次のようになります:
listener = new MessageListener() {
@Override
public void deliver(Client fromClient, Client toClient, Message msg) {
if (!_connected) {
_connected = true;
synchronized (this) {
this.notify();
}
}
Object data = msg.getData();
if (data instanceof Map) {
Map map = (Map) data;
Object rawPayload = map.get("xmlpayload");
if (rawPayload instanceof String) {
System.out.println("xmlpayload = " + rawPayload);
ByteArrayInputStream bais;
try {
String xmlPayload = ((String) rawPayload).replaceAll(">",">").replaceAll("<", "<").replaceAll("&","&");
bais = new ByteArrayInputStream(xmlPayload.getBytes("UTF-8"));
XMLDecoder xmlDecoder = new XMLDecoder(bais);
Object o = xmlDecoder.readObject();
xmlDecoder.close();
System.out.println(">> decoded payload=" + o + ", class=" + o.getClass());
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("no UTF-8", e);
}
}
}
}
};
address = new Address("localhost", 8080);
bayreuxClient = new BayeuxClient(httpClient, address, "/cometd/cometd");
bayreuxClient.addListener(listener);
あなたは、私が送信された文字列は、私は、その後に次に、xmlDecodeの保護を解除し、呼び出して保護されたより大きく、より小さく、そしてアンパサンド文字を持っていることを試行錯誤によって発見した見ることができるようにます。
出力されます:
xmlpayload = <?xml version="1.0" encoding="UTF-8"?>
<java version="1.6.0_16" class="java.beans.XMLDecoder">
<object class="java.util.HashMap">
<void method="put">
<string>intArray</string>
<array class="int" length="1">
<void index="0">
<int>1</int>
</void>
</array>
</void>
</object>
</java>
>> decoded payload={intArray=[I@2f1e75}, class=class java.util.HashMap
それは可逆的です。 XMLEncoded / XMLDecodedである文字列オブジェクトの内部でこれらの文字を入れてと私の実験は良くなかった - 彼らはproctected二重にされませんでした - 。そう、私のブルート復号化はまた、それらに影響を与えた。
質問は次のとおりです。これらの文字列をデコードするために、の適切なの方法は何ですか?私は私の迅速かつ汚いコードの代わりに使用する必要がJSONライブラリはありますか?私はcometdのためのJavaクライアントライブラリでエラーを直撃しているのでしょうか?
(注意:私は、この実験のためのcometd-1.0.0rc0のライブラリを使用している)。
。 <時間>編集:それはコミュニケーションは私がを1よりも、同じWebサーバ内の別の展開を通じて起こっていることが判明した。はcometd通信の世話をした、とのの展開に含まれるフィルタと思いましたXMLの保護をしました.json。
http://groups.google.com/group/cometd -users / browse_thread /スレッド/ 6fbdaae669e5f9d3する
つまり私のコード外の設定の問題。うまくいけば、改訂された展開では、この問題を解決します。
解決
アンエスケープのXMLに使用するのに最適なライブラリーは、Apache Commonsのラングで、
StringEscapeUtils.unescapeXml();
これはあなたが使用バイユーJavaクライアントのバグであるように見えます。その符号化/復号化は、対称ではありません。私はそれを使用するつもりでした。今、私は二回だと思います)。