首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带有javax.xml.soap命名空间错误的SOAP消息?

带有javax.xml.soap命名空间错误的SOAP消息?
EN

Stack Overflow用户
提问于 2011-08-22 13:18:25
回答 2查看 30.7K关注 0票数 4

下面是我应该从java应用程序中调用的.NET web服务的通用示例SOAP请求:

代码语言:javascript
复制
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
 <soap:Body>
  <setAMRequestData xmlns="http://tempuri.org/">
    <id>int</id>
  </setAMRequestData>
 </soap:Body>
</soap:Envelope>

我能够使用以下代码段从java控制台应用程序中生成类似的内容:

代码语言:javascript
复制
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
...
SOAPConnectionFactory sfc = SOAPConnectionFactory.newInstance();
SOAPConnection connection = sfc.createConnection();
MessageFactory mf = MessageFactory.newInstance();
SOAPMessage sm = mf.createMessage();

SOAPHeader sh = sm.getSOAPHeader();
SOAPBody sb = sm.getSOAPBody();
sh.detachNode();

QName bodyName = new QName("http://tempuri.org/", "setAMRequestData", XMLConstants.DEFAULT_NS_PREFIX);
SOAPBodyElement bodyElement = sb.addBodyElement(bodyName);
QName n = new QName("id");                                          
SOAPElement quotation = bodyElement.addChildElement(n);
quotation.addTextNode("121152");

结果是以下XML:

代码语言:javascript
复制
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
 <SOAP-ENV:Body>
  <setAMRequestData xmlns="http://tempuri.org/">
   <id>121152</id>
  </setAMRequestData>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

这会调用服务。接下来,我使用soapUI尝试调用此服务,它从WSDL中生成soap消息,如下所示(在信封和前缀中,与前面的名称空间声明中的不同):

代码语言:javascript
复制
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                  xmlns:tem="http://tempuri.org/">
 <soapenv:Header/>
  <soapenv:Body>
   <tem:setAMRequestData>
     <tem:id>?</tem:id>
   </tem:setAMRequestData>
  </soapenv:Body>
 </soapenv:Envelope>

这也适用于soapUI。但最后,当我试图使用以下代码序列重新创建这种形式的soap消息时:

代码语言:javascript
复制
// factories and stuff, like in the example above
SOAPPart part = sm.getSOAPPart();
SOAPEnvelope envelope = part.getEnvelope();
envelope.addNamespaceDeclaration("tem", "http://tempuri.org/");

SOAPHeader sh = sm.getSOAPHeader();
SOAPBody sb = sm.getSOAPBody();
sh.detachNode();

QName bodyName = new QName(null, "setAMRequestData", "tem");
SOAPBodyElement bodyElement = sb.addBodyElement(bodyName);
QName n = new QName(null, "id", "tem");
SOAPElement quotation = bodyElement.addChildElement(n);
quotation.addTextNode("7028");

在SOAPElement引号=bodyElement.addChildElement(N)行中我得到了以下异常:

org.w3c.dom.DOMException: NAMESPACE_ERR:尝试以一种与名称空间有关的不正确的方式创建或更改对象。

无论我尝试了什么,我都不能为id元素设置"tem“前缀.这里发生什么事情?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-22 15:12:24

您正在将命名空间uri绑定到前缀,然后尝试创建一个具有相同前缀但具有空名称空间uri的元素:

代码语言:javascript
复制
envelope.addNamespaceDeclaration("tem", "http://tempuri.org/");
...
QName bodyName = new QName(null, "setAMRequestData", "tem");

元素由命名空间uri和本地名称的组合来标识。要解决这个问题,必须在创建的每个元素上指定名称空间:

代码语言:javascript
复制
QName bodyName = new QName("http://tempuri.org/", "setAMRequestData", "tem");
...
QName n = new QName("http://tempuri.org/", "id", "tem");
票数 7
EN

Stack Overflow用户

发布于 2011-08-22 18:15:16

不要太激动,因为您的应用程序中的XML看起来与SoapUI发出的请求不完全相同(特别是名称空间前缀)。将您的代码粘贴到SoapUI请求中,右键单击,重新格式化,并查看SoapUI是否理解您的内容(如果您有专业版本,请在表单和大纲视图中检查它)。如果它看起来还好,就启动它,看看您是否得到了与本机(soapUI)请求相同的响应。如果是的话,你就可以走了。但是,如果事情发生在错误的地方,名称空间被破坏,SoapUI不能呈现您的XML,那么您的代码中就有一些调整要做。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7148081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档