2009-09-28 5 views
0

Я хочу, чтобы произвольные XMLEncoded java-объекты возвращались назад и вперед с использованием Do cometd-каналов, и у меня есть проблема, правильно декодирующая полезную нагрузку.Правильный способ декодирования ответа в клиенте dojo cometd java

Для того, чтобы сделать это у меня есть этот метод отправки в усеченную версию чата клиента демонстрационной программы:

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

Который сейчас создает XML-фрагмент сплющенный в поток байтов UTF-8 кодируются (Мне известно, что мне тоже нужно позаботиться о кодировке, но теперь это не проблема).

Слушатель сообщение принимая это выглядит следующим образом:

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, которую мне нужно использовать вместо моего быстрого и грязного кода? Возможно, я ошибся в клиентской библиотеке Java для cometd?

(Примечание: я использовал библиотеки cometd-1.0.0rc0 для этого эксперимента).


EDIT: Оказалось, что общение происходило через другое развертывание в том же веб-сервере, чем тот, который я думал, заботился о cometd связи и что развертывания содержатся filter.json, которые сделали XML защита.

http://groups.google.com/group/cometd-users/browse_thread/thread/6fbdaae669e5f9d3

Другими словами вопрос конфигурации вне моего кода. Надеемся, что исправленное развертывание устранит эту проблему.

ответ

0

Лучшая библиотека для использования в XML является экранирования в Apache Commons Lang,

StringEscapeUtils.unescapeXml(); 

Похоже, это ошибка в клиенте Байе Java вы используете. Его кодирование/декодирование не являются симметричными. Я собирался использовать его. Сейчас я буду думать дважды :)

 Смежные вопросы

  • Нет связанных вопросов^_^