Настройка клиента веб-службы CXF для чтения ответов XML 1.1

Я использую 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 ответ

Решение

Похоже, ответ... нет способа предварительно сконфигурировать 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, что "решило бы" проблему для меня. Если я найду способ заставить его работать, я опубликую его.

Другие вопросы по тегам