我有这种形式的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
答案 0 :(得分:2)
我将其描述为剥离SOAP信封的代码中的错误;它应该保留命名空间上下文,但它没有这样做,而且这打破了XML。我猜这是因为它通过获取子字符串而不是在DOM元素级别进行操作来进行剥离(无论是否使用DOM处理进行剥离都不是重点)。我不是确定哪个组件正在进行剥离,因为这些东西可以嵌套,但我怀疑它是WebLogic ......
[编辑]:我已经检查了SOAP specification并且没有说正文的内容必须直接声明所使用的命名空间(参见§5.3.1),尽管它确实说它应该是被命名空间。因此,适用普通的XML命名空间规则 - 整个SOAP消息只是一个XML文档 - 这会使WebLogic的行为成为错误。