SOAP повторно объявляет qname внутри тела

У меня есть 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

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

Итак: SOAPUI 4.0.1, CXF 2.5.0


person David Portabella    schedule 11.01.2012    source источник


Ответы (1)


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


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

person Donal Fellows    schedule 11.01.2012
comment
Спасибо за ответ; однако это предположение, и я с ним согласен, но мне нужен окончательный ответ. - person David Portabella; 11.01.2012
comment
@David: Окончательный ответ заключается в том, что спецификация SOAP ничего не говорит об этом. Применяются обычные правила XML. WebLogic глючит. - person Donal Fellows; 11.01.2012
comment
мне хочется так сказать, но вы согласитесь со мной, в это немного трудно поверить... :) Я разместил вопрос на форуме weblogic: forums.oracle.com/forums/ - person David Portabella; 11.01.2012
comment
упс, даже если я использовал сервер приложений WebLogic, я использовал структуру веб-сервисов CXF. Я разместил проблему там. issues.apache.org/jira/browse/CXF-4026 - person David Portabella; 12.01.2012
comment
Я использую CXF внутри Tomcat и никогда не видел ничего подобного тому, что вы описываете. - person Donal Fellows; 12.01.2012