Настройка клиента веб-службы CXF для чтения ответов XML 1.1 - PullRequest
2 голосов
/ 30 марта 2012

Я использую CXF для генерации интерфейса для клиента веб-службы .NET. Однако иногда, когда я пользуюсь клиентом, я получаю сообщение об ошибке:

WARNING: Interceptor for {http://xxxxxx.com}ChangeRequestWebService#{http://xxxxxx.com/ChangeRequestWebService}GetChangeRequestById has thrown exception, unwinding now
[com.ctc.wstx.exc.WstxLazyException] com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character (code 0x1b
 at [row,col {unknown-source}]: [76,44]

Из многих других источников в Интернете очевидно, что это происходит потому, что веб-служба кодирует свой ответ в XML 1.1, в то время как мой клиент CXF читает этот ответ, ожидая XML 1.0, а специальный символ 0x1b недопустим в XML 1.0. Теперь я не хочу спорить о том, должна ли служба .NET использовать XML 1.1 в своем ответе, когда WSDL, очевидно, равен 1,0 (поскольку это спецификация). Я просто хочу иметь возможность читать то, что они отправляют без ошибок.

Рассматривая зависимости в клиенте CXF, они используют WoodStox 4.1.1, которая (с их сайта) явно поддерживает XML 1.1. Я хочу знать, есть ли способ настроить мой клиент CXF (через привязку во время wsdl2java или во время выполнения) для использования анализатора XML 1.1 при получении ответов? Все, что я могу найти, это люди говорят, что они не должны использовать 1.1 или фильтровать эти символы на стороне сервера. Обратите внимание, что я не могу фильтровать символы на стороне клиента, так как мне нужно отправить данные обратно на сервер, и проверка не удастся.

В качестве альтернативы, я полагаю, что служба .NET могла бы каким-то образом УКАЗАТЬ, что они используют XML 1.1 в своем ответе, но я не контролирую эту службу, поэтому было бы сложнее выяснить их проблему для их, а затем предложить, чтобы они это исправить. Кроме того, данные, которые они отправляют, находятся в БД, поэтому веб-служба не виновата в том, что в ней есть только символы XML 1.1.

1 Ответ

1 голос
/ 31 марта 2012

Похоже, что ответ ... нет никакого способа предварительно сконфигурировать CXF для ожидания XML 1.1 по умолчанию.

По существу, если XML входит без тега версии:

<?xml version="1.1">

Тогда это не XML 1.1.Это проблема здесь.Если бы заголовок xml существовал и указывал XML 1.1, то синтаксический анализатор в CXF проанализировал бы его как XML 1.1.Веб-службы .NET (по умолчанию) не отправляют любой тег заголовка XML, поэтому анализатор в CXF (правильно) анализирует его как XML 1.0.

При этом может бытьспособ перехвата входного потока до его синтаксического анализа в CXF и «вставка» заголовка версии XML с указанием 1.1, что «решило бы» проблему для меня.Если я найду способ заставить его работать, я опубликую его.

...