2009-09-28 62 views
0

響應我要推任意XMLEncoded的Java有道對象來回使用道場的cometd渠道,我有一個問題,正確解碼的有效載荷。來解碼道場的cometd 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("&gt;",">").replaceAll("&lt;", "<").replaceAll("&amp;","&"); 
     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 = &lt;?xml version="1.0" encoding="UTF-8"?&gt; 
&lt;java version="1.6.0_16" class="java.beans.XMLDecoder"&gt; 
&lt;object class="java.util.HashMap"&gt; 
    &lt;void method="put"&gt; 
    &lt;string&gt;intArray&lt;/string&gt; 
    &lt;array class="int" length="1"&gt; 
    &lt;void index="0"&gt; 
    &lt;int&gt;1&lt;/int&gt; 
    &lt;/void&gt; 
    &lt;/array&gt; 
    &lt;/void&gt; 
&lt;/object&gt; 
&lt;/java&gt; 

>> decoded payload={intArray=[[email protected]}, class=class java.util.HashMap 

所以它是可逆的。我將這些字符置於XMLEncoded/XMLDecoded字符串對象中的實驗並不好 - 它們沒有被雙重保護 - 所以我的蠻力解碼也影響了它們。

的問題是:什麼是這些字符串解碼正確方法是什麼?是否有我需要使用的JSON庫,而不是我的快速和髒代碼?可能我在Java客戶端庫中遇到了cometd錯誤?

(注意:我一直在使用cometd-1.0.0rc0庫進行這個實驗)。


編輯:原來,通信通過在同一個網絡服務器比我認爲拿着的cometd通信照顧另一個部署發生了,那部署包含filter.json該做的XML保護。

http://groups.google.com/group/cometd-users/browse_thread/thread/6fbdaae669e5f9d3

換句話說我的代碼外的配置問題。希望修改後的部署可以解決這個問題。

回答

0

用來UNESCAPE XML最好的圖書館就是Apache Commons Lang中,

StringEscapeUtils.unescapeXml(); 

看起來這是在你使用的貝葉Java客戶端的錯誤。其編碼/解碼不對稱。我打算使用它。現在我會三思:)