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

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

   int    

我可以使用以下代码段从java控制台应用程序生成类似的东西:

 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:

    121152    

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

     ?    

这也适用于soapUI。 但最后,当我尝试使用此代码序列重新创建此forms的soap消息时:

 // 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)中得到以下exception;

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

无论我尝试什么,我根本无法为id元素设置“tem”前缀……这里发生了什么?

谢谢。

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

 envelope.addNamespaceDeclaration("tem", "http://tempuri.org/"); ... QName bodyName = new QName(null, "setAMRequestData", "tem"); 

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

 QName bodyName = new QName("http://tempuri.org/", "setAMRequestData", "tem"); ... QName n = new QName("http://tempuri.org/", "id", "tem"); 

不要全力以赴,因为来自您的应用程序的XML看起来与SoapUI提出的请求看起来并不完全相同(尤其是名称空间前缀)。 将您的代码粘贴到SoapUI请求中,右键单击,重新格式化,并查看SoapUI是否了解您的内容(如果您有专业版,请在表单和大纲视图中查看)。 如果看起来没问题,请将其关闭并查看是否获得与本机(soapUI)请求相同的响应。 如果是这样,你很高兴。 但是,如果事情在错误的位置,名称空间被破坏,SoapUI无法呈现您的XML,那么您需要在代码中进行一些调整。