2009-09-28 5 views
0

Je veux pousser arbitrairement des objets java XMLEncoded en utilisant les canaux comjo de Dojo, et j'ai un problème décoder la charge utile correctement.Bonne façon de décoder la réponse dans le client Dojo cometd java

Pour ce faire, je cette méthode d'envoi dans une version allégée de la salle de chat programme de démonstration client:

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())); 
} 

Ce qui pour crée maintenant un extrait de XML aplati à un UTF-8 flux d'octets codé (Je suis conscient que je dois aussi prendre soin de l'encodage, mais ce n'est pas le problème maintenant).

L'auditeur de message accepter cela ressemble:

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); 

Comme vous pouvez le voir, je l'ai trouvé par tâtonnement que la chaîne envoyée a son moins, supérieur et caractères esperluette protégé que je Ôter la protection alors et appelez XMLDecode.

La sortie est la suivante:

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 

de sorte qu'il est réversible. Mes expériences avec l'insertion de ces caractères dans des objets string en XMLEncoded/XMLDecoded n'étaient pas bonnes - ils n'étaient pas protégés en double - donc mon décodage brut les affectait aussi.

La question est: Quelle est la correcte façon de décoder ces chaînes? Y a-t-il une bibliothèque JSON que je dois utiliser au lieu de mon code rapide et sale? Est-ce que j'ai pu rencontrer une erreur dans la bibliothèque cliente Java pour cometd?

(Note: J'ai utilisé les bibliothèques cometd-1.0.0rc0 pour cette expérience).


EDIT: Il est apparu que la communication est passé par un autre déploiement dans le même serveur Web que celui que je pensais a pris soin des communications cometd et que le déploiement contenait filter.json qui a fait le XML protection.

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

En d'autres termes, un problème de configuration en dehors de mon code. Espérons qu'un déploiement révisé permettra de remédier à ce problème.

Répondre

0

La meilleure bibliothèque à utiliser pour XML unescape est Apache Commons Lang,

StringEscapeUtils.unescapeXml(); 

On dirait que ce bogue dans le client Java Bayeux que vous utilisez. Son encodage/décodage n'est pas symétrique. J'allais l'utiliser. Maintenant, je vais réfléchir à deux fois :)

Questions connexes