maneira correta de resposta de decodificação no Dojo cliente cometd java
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(">",">").replaceAll("<", "<").replaceAll("&","&");
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 = <?xml version="1.0" encoding="UTF-8"?>
<java version="1.6.0_16" class="java.beans.XMLDecoder">
<object class="java.util.HashMap">
<void method="put">
<string>intArray</string>
<array class="int" length="1">
<void index="0">
<int>1</int>
</void>
</array>
</void>
</object>
</java>
>> 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 ??em> 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.
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:)