Question

Je veux pousser des objets java XMLEncoded arbitraire en arrière en utilisant les canaux Dojo de cometd, et j'ai un problème de décodage de la charge utile correctement.

Pour ce faire, j'ai cette méthode d'envoi dans une version dépouillé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 flux d'octets codé UTF-8 (je suis conscient que je dois prendre soin de l'encodage aussi, mais ce n'est pas la question 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 a envoyé son moins, supérieur et caractères esperluette protégé que je puis et appelle ôter la protection xmlDecode sur.

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=[I@2f1e75}, class=class java.util.HashMap

de sorte qu'il est réversible. Mes expériences avec mettre ces caractères à l'intérieur des objets chaîne étant XMLEncoded / XMLDecoded ne sont pas bonnes - ils ne sont pas doubles proctected -. Donc mon décodage brute aussi les touche

La question est: Quelle est la façon de décoder ces chaînes bon ? Y at-il une bibliothèque JSON-je utiliser au lieu de mon code rapide et sale? Puis-je avoir touché une erreur dans la bibliothèque client Java pour cometd?

(Note: J'utilise 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 I pensé a pris soin des communications cometd et que filtre contenu de déploiement .json qui a fait la protection XML.

http://groups.google.com/group/cometd -fr / browse_thread / fil / 6fbdaae669e5f9d3

En d'autres termes, un problème de configuration en dehors de mon code. Il faut espérer un déploiement révisé remédier à ce problème.

Était-ce utile?

La solution

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 ne sont pas symétriques. Je vais l'utiliser. Maintenant, je vais réfléchir à deux fois:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top