Dojo cometd 채널을 사용하여 임의의 XMLEncoded java 오브젝트를 앞뒤로 누른다. 페이로드를 올바르게 디코딩 할 때 문제점이있다. 이 작업을 수행하기 위해Dojo cometd java 클라이언트에서 응답을 디코딩하는 올바른 방법
나는이 대화방 클라이언트 데모 프로그램의 버전을 박탈이 전송 방법 : 지금을 위해 UTF-8로 인코딩 된 바이트 스트림에 평평 XML 조각을 생성
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()));
}
(나는 또한 인코딩을 처리해야한다는 것을 알고 있지만, 지금은 문제가 아니다).
는 메시지 리스너는 수용이 보이는 같은 :
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);
당신은 내가 보낸 문자열보다보다 그것의 더 적은을 가지고 시행 착오를 발견하고, 앰퍼샌드 문자가 그때의 보호를 해제하는 보호 볼 수 있듯이 XMLDecode를 호출합니다.
출력은 :
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=[[email protected]}, class=class java.util.HashMap
그래서이 가역적이다. 이 문자들을 XMLEncoded/XMLDecoded 인 문자열 객체 안에 넣는 실험은 좋지 않았습니다. 그들은 이중 검사를받지 못했습니다.
질문 : 올바른 이러한 문자열을 디코딩하는 방법은 무엇입니까? 빠르고 간단한 코드 대신 필요한 JSON 라이브러리가 있습니까? cometd의 Java 클라이언트 라이브러리에서 오류가 발생했을 수 있습니까?
(참고 :이 실험에는 cometd-1.0.0rc0 라이브러리를 사용하고 있습니다).
편집 : 그것은 통신이는 cometd 통신을 처리했다 내가 생각했던 것보다 같은 웹 서버에서 다른 배치를 통해 일어난 것으로 밝혀졌다, 그리고 배포는 XML을했다 filter.json을 포함 것을 보호. 즉
http://groups.google.com/group/cometd-users/browse_thread/thread/6fbdaae669e5f9d3
내 코드 외부에 구성 문제. 잘 개정 된 배포로이 문제를 해결할 수 있기를 바랍니다. 언 이스케이프의 XML을 사용하는