SOAP повторно объявляет qname внутри тела - PullRequest
1 голос
/ 11 января 2012

У меня есть SOAP-запрос этой формы:

<soapenv:Envelope 
      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
      xmlns:myqname="http://example.com/hello" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Header/>
   <soapenv:Body>
      <myqname:MyRequest xmlns:myqname="http://example.com/hello">
         ...
      </myqname:MyRequest>
   </soapenv:Body>
</soapenv:Envelope>

Если я попрошу SOAPUI «отформатировать XML» этот запрос, удаляет второе объявление myqname, поэтому я получаю следующее:

<soapenv:Envelope 
      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
      xmlns:myqname="http://example.com/hello" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Header/>
   <soapenv:Body>
      <myqname:MyRequest>
         ...
      </myqname:MyRequest>
   </soapenv:Body>
</soapenv:Envelope>

Оригинальный запрос работает нормально, но серверы приложений не работают с измененным запросом с этой ошибкой:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Client</faultcode>
         <faultstring>Unmarshalling Error: UndeclaredPrefix: Cannot resolve 'myqname:MyRequest' as a QName: the prefix 'myqname' is not declared.</faultstring>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>

Согласно спецификации веб-сервисов, Обязательно ли повторное объявление qname внутри узла soapenv: Body? Это ошибка SOAPUI или ошибка сервера приложений? или недоразумение с моей стороны?

SOAPUI 4.0.1, версия сервера WebLogic: 10.3.2.0

Edit: ups, даже если я использовал сервер приложений WebLogic, я использовал платформу веб-сервисов CXF. Я разместил проблему там. issues.apache.org/jira/browse/CXF-4026

Итак: SOAPUI 4.0.1, CXF 2.5.0

1 Ответ

2 голосов
/ 11 января 2012

Я бы описал это как ошибку в коде, которая лишает конверт SOAP; он должен сохранять контекст пространства имен, но не делает этого, и это нарушает XML. Я предполагаю, что это потому, что он выполняет разбор, беря подстроку, а не работает на уровне элемента DOM (независимо от того, использует ли он обработку DOM для разборки, не имеет значения). Я не уверен , какой компонент выполняет это удаление из-за того, как эти вещи могут быть вложены, но я подозреваю, что это WebLogic…


[РЕДАКТИРОВАТЬ]: я проверил спецификацию SOAP , и он не говорит, что содержимое тела должно напрямую объявлять используемое пространство имен (см. §5.3.1), хотя и говорит что это ДОЛЖНО быть пространством имен. Из-за этого применяются нормальные правила пространства имен XML - все сообщение SOAP является просто документом XML - и это может привести к ошибкам в поведении WebLogic.

...