Конечная точка JAX-WS только частично экранирует строку XML - PullRequest
6 голосов
/ 07 марта 2011

У меня есть конечная точка JAX-WS с несколькими методами, которые все возвращают документы XML, преобразованные в строку.

В течение некоторого времени это работало нормально на Sun Java System Application Server 9.1 Update 2, но его необходимо развернуть на новом сервере.

Он был развернут на Glassfish 3.0.1 без каких-либо проблем, за исключением одной небольшой проблемы.Пример исходного ответа:

<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Body>
    <ns2:getTransactionTypesResponse xmlns:ns2="http://myns.com.au/">
      <return xmlns="">&lt;?xml version="1.0" encoding="UTF-8"?&gt;

&lt;my_xml version="1.2" query_date=""&gt;
  &lt;add_transaction_type description="Contributions" name="Contribution" type="C"/&gt;
  &lt;add_transaction_type description="Transfer In" name="Xfr or R/O In" type="X"/&gt;
&lt;/my_xml&gt;
      </return>
    </ns2:getTransactionTypesResponse>
  </S:Body>
</S:Envelope>

На новом сервере он возвращается как:

<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Body>
    <ns2:getTransactionTypesResponse xmlns:ns2="http://myns.com.au/">
      <return>&lt;?xml version="1.0" encoding="UTF-8"?>

&lt;myxml version="1.2" query_date="">
  &lt;add_transaction_type description="Contributions" name="Contribution" type="C"/>
  &lt;add_transaction_type description="Administration Fee" name="Fee:AUM" type="U"/>
&lt;/my_xml>
      </return>
    </ns2:getTransactionTypesResponse>
  </S:Body>
</S:Envelope>

Почти то же самое, но экранируются только угловые скобки открытия, а незакрывающие скобки.

Я проверил это с помощью прямых запросов HTTP POST, поэтому я знаю, что он не искажается никаким клиентским кодом.

Я снова обновил сервер до Glassfish 3.1, думая тамбыла проблема с включенными библиотеками веб-сервиса, но безуспешно.Мое приложение полностью зависит от поддержки веб-сервиса в glassfish - оно не включает ни одной из своих собственных библиотек WS или XML.

Конечная точка в основном определяется следующим образом:

@WebService
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT, use=SOAPBinding.Use.LITERAL, parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)
public class MyEndpoint {
  @WebMethod()
  public String getTransactionTypes() {
    return someMethodThatReturnsXmlString();
  }
}

Я былНе удалось найти кого-либо еще с этой проблемой, кроме ссылки от этого автора, который заметил, что он является потребителем службы: Могу ли я заставить JAXB не преобразовывать «в», например, при сортировке в XML?

Это опубликованная услуга, поэтому я не могу полагаться на то, что потребители смогут обновить своих клиентов, чтобы справиться с этим.Интересно, что мой существующий интерфейс тестирования с использованием сгенерированного Java-клиента, похоже, не беспокоит его, но я не могу на это полагаться.

Кто-нибудь сталкивался с этим и смог его решить?Есть ли способ, которым я могу подключиться к платформе WS и сделать свой собственный выход в качестве обходного пути?

Заранее спасибо.

1 Ответ

4 голосов
/ 07 марта 2011

С http://www.w3.org/TR/xml/#syntax, сечение 2.4

Символ амперсанда (&) и левая угловая скобка (<) не должны появляться в их буквальной форме, кроме случаев, когда они используются в качестве разделителей разметки,или внутри комментария, инструкции по обработке или раздела CDATA.Если они нужны где-то еще, их необходимо экранировать, используя либо числовые ссылки на символы, либо строки «&» и «<» соответственно.Правая угловая скобка (>) может быть представлена ​​с помощью строки ">" и для совместимости должна быть экранирована с использованием либо ">", либо ссылки на символ, когда она появляется в строке "]]>" в содержимом, когда этоСтрока не обозначает конец раздела CDATA.

В нем говорится, что правая угловая скобка (>) может быть экранирована, но это не обязательно, поэтому с вами все будет в порядке.

...