2009-09-28 5 views
0

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("&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); 

당신은 내가 보낸 문자열보다보다 그것의 더 적은을 가지고 시행 착오를 발견하고, 앰퍼샌드 문자가 그때의 보호를 해제하는 보호 볼 수 있듯이 XMLDecode를 호출합니다.

출력은 :

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=[[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을 사용하는

답변

0

가장 좋은 도서관이 사용하는 바 이외 Java 클라이언트에서 문제를 같이

StringEscapeUtils.unescapeXml(); 

이 보이는, 아파치 코 몬즈 랭입니다. 인코딩/디코딩은 대칭이 아닙니다. 나는 그것을 사용하려고했다. 이제 두 번 생각할 것입니다.

관련 문제