Pergunta

Eu quero empurrar java XMLEncoded arbitrária objetos e para trás usando Dojo cometd canais, e eu tenho um problema de decodificação a carga corretamente.

Para fazer isso eu tenho este método de envio em uma versão simplificada do programa de demonstração cliente 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()));
}

que por enquanto cria um trecho XML achatada para um fluxo de bytes codificado UTF-8 (eu sou necessidade I ciente para cuidar também a codificação, mas isso não é o problema agora).

O ouvinte mensagem aceitar isto se parece com:

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 você pode ver eu descobri por tentativa e erro que o enviado corda tem o seu menor que, maior do que, e comercial caracteres protegidos que eu então XMLDecode desproteger e de chamada.

A saída é:

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

por isso é reversível. Minhas experiências com colocando esses personagens dentro de seqüência de objetos sendo XMLEncoded / XMLDecoded não eram bons - eles não estavam dupla proctected -. Por isso a minha bruta também decodificação afetou

A pergunta é: Qual é a correta maneira de decodificar essas cordas? Existe uma biblioteca JSON que eu preciso para usar em vez do meu código rápido e sujo? Posso ter atingido um erro na biblioteca cliente Java para cometd?

(Nota: Tenho vindo a utilizar os cometd-1.0.0rc0 bibliotecas para este experimento).


EDIT: Descobriu-se que a comunicação ocorreu através de outro implantação no mesmo servidor que o que eu pensei cuidava das comunicações cometd, e que implantação contido filtro .json que fez a proteção XML.

http://groups.google.com/group/cometd -Usuários / browse_thread / thread / 6fbdaae669e5f9d3

Em outras palavras, um problema de configuração fora do meu código. Esperemos que uma implantação revista vai resolver esta questão.

Foi útil?

Solução

A melhor biblioteca para uso de XML unescape é Apache Commons Lang,

   StringEscapeUtils.unescapeXml();

Parece que este é um bug no cliente Bayeux Java você usa. Sua codificação / decodificação não são simétricas. Eu estava indo para usá-lo. Agora vou pensar duas vezes:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top