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

标签 java asp.net web-services soap soapui

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

<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 控制台应用程序生成类似的东西:

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:

<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 消息,如下所示(它不同于在信封中的 namespace 声明中的前面,以及前缀):

<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 消息时:

// 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 quotation = bodyElement.addChildElement(n); 行中遇到以下异常:

org.w3c.dom.DOMException: NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces.

无论我怎样尝试,我都无法为 id 元素设置“tem”前缀……这是怎么回事?

谢谢。

最佳答案

您将命名空间 uri 绑定(bind)到前缀,稍后尝试创建具有相同前缀但具有空命名空间 uri 的元素:

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

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

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

关于java - 带有 javax.xml.soap 的 SOAP 消息 - 命名空间错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7148081/

相关文章:

java - 如何编写Java代码从需要登录并使用POST请求的网站读取字段?

java - 使用 GridLayout 垂直对齐 jpanels 的组件

java - 使用 java 针对两个模式验证 xml

c# - 如何在登录流程中查找客户端 ID

asp.net - ASP.NET 中的重定向问题

c# - 使用服务时如何避免冲突? (.NET C#)

java - 为什么 Jersey 2.22 的 Jersey bundle 中包含 "javax.servlet-api-3.0.1"?

java - 创建评估新创建的变量的代码模板

c# - ASP.NET Web API 更改请求 URI(重定向到另一种方法)

java - 在 eclipse 之外的 tomcat 上部署轴 2 Web 服务