我想使用Dojo cometd通道来回推送任意XMLEncoded java对象,我在解决有效负载时遇到问题。
为了做到这一点,我在聊天室客户端演示程序的精简版本中有这个发送方法:
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并不好 - 它们没有被双重检测 - 所以我的粗暴解码也影响了它们。
问题是:正确的解码这些字符串的方法是什么?我需要使用JSON库而不是快速而脏的代码吗?我可能在Java客户端库中遇到了一个错误吗?
(注意:我一直在使用cometd-1.0.0rc0库进行此实验)。
编辑:事实证明,通信是通过同一个网络服务器中的另一个部署而不是我认为处理cometd通信的部署,而 部署包含过滤器.json做了XML保护。
http://groups.google.com/group/cometd-users/browse_thread/thread/6fbdaae669e5f9d3
换句话说,我的代码之外的配置问题。希望修改后的部署可以解决这个问题。
答案 0 :(得分:0)
用于unescape XML的最佳库是Apache Commons Lang,
StringEscapeUtils.unescapeXml();
看起来这是您使用的Bayeux Java客户端中的错误。其编码/解码不对称。我打算用它。现在我会三思而后行:)