Pregunta

I quiere empujar arbitraria java XMLEncoded objetos de ida y vuelta utilizando canales cometd Dojo, y tengo un problema descodificar la carga útil correctamente.

Con el fin de hacer esto tengo este método de envío en una versión simplificada del programa de demostración de clientes sala de chat:

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

Lo que por ahora crea un fragmento de XML aplanado a un flujo de bytes codificación UTF-8 (Soy consciente de que tengo que cuidar de la codificación también, pero ese no es el tema ahora).

El oyente mensaje de aceptación será similar a:

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

Como se puede ver que he encontrado por ensayo y error que la cadena tiene su enviado menor que, mayor que, y caracteres ampersand protegida que luego desproteger y llamo XMLDecode sucesivamente.

La salida es:

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

lo que es reversible. Mis experimentos con poner estos caracteres dentro de los objetos de cadena que son XMLEncoded / XMLDecoded no estaban bien - no eran de doble proctected -. Por lo que mi decodificación bruta también les afectó

La pregunta es: ¿Cuál es la forma adecuada para decodificar estas cadenas? ¿Hay una biblioteca JSON que necesito para usar en lugar de mi código rápido y sucio? ¿Podría haber golpeado a un error en la biblioteca cliente Java para cometd?

(Nota: He estado usando las bibliotecas cometd-1.0.0rc0 para este experimento)

.

EDIT: Resultó que la comunicación ha pasado a través de otro despliegue en el mismo servidor web que el I pensó se hizo cargo de las comunicaciones cometd, y que filtro de despliegue que figura .json la que hizo la protección XML.

http://groups.google.com/group/cometd -Los usuarios / browse_thread / hilo / 6fbdaae669e5f9d3

En otras palabras, un problema de configuración fuera de mi código. Es de esperar un revisado de despliegue va a remediar este problema.

¿Fue útil?

Solución

La mejor biblioteca para usar a XML unescape es Apache Commons Lang,

   StringEscapeUtils.unescapeXml();

Parece que este es un error en el cliente de Bayeux Java que utilice. Su codificación / decodificación no son simétricas. Iba a utilizarlo. Ahora voy a pensar dos veces:)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top