SOAP在body中重新声明qname

时间:2012-01-11 13:21:42

标签: web-services soap cxf soapui

我有这种形式的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>

根据网络服务规范, 是否必须在soapenv:Body节点内重新声明qname? 这是SOAPUI错误还是Application Server错误?或者是我的误解?

SOAPUI 4.0.1,WebLogic Server版本:10.3.2.0

编辑:ups,即使使用WebLogic应用服务器,我也在使用CXF Web服务框架。我在那里发布了这个问题。 issues.apache.org/jira/browse/CXF-4026

所以:SOAPUI 4.0.1,CXF 2.5.0

1 个答案:

答案 0 :(得分:2)

我将其描述为剥离SOAP信封的代码中的错误;它应该保留命名空间上下文,但它没有这样做,而且这打破了XML。我猜这是因为它通过获取子字符串而不是在DOM元素级别进行操作来进行剥离(无论是否使用DOM处理进行剥离都不是重点)。我不是确定哪个组件正在进行剥离,因为这些东西可以嵌套,但我怀疑它是WebLogic ......


[编辑]:我已经检查了SOAP specification并且没有说正文的内容必须直接声明所使用的命名空间(参见§5.3.1),尽管它确实说它应该是被命名空间。因此,适用普通的XML命名空间规则 - 整个SOAP消息只是一个XML文档 - 这会使WebLogic的行为成为错误。