如何使用 Apache Axis2 和 WSDL2Java 向 SOAP 响应添加命名空间引用

Posted

技术标签:

【中文标题】如何使用 Apache Axis2 和 WSDL2Java 向 SOAP 响应添加命名空间引用【英文标题】:How do I add a namespace reference to a SOAP response with Apache Axis2 and WSDL2Java 【发布时间】:2010-09-09 15:38:24 【问题描述】:

我正在查看我正在开发的 Web 服务的 SOAP 输出,我注意到一些奇怪的事情:

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
   <soapenv:Body>
      <ns1:CreateEntityTypesResponse xmlns:ns1="http://somedomain.com/wsinterface">
         <newKeys>
            <value>1234</value>
         </newKeys>
         <newKeys>
            <value>2345</value>
         </newKeys>
         <newKeys>
            <value>3456</value>
         </newKeys>
         <newKeys xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
         <newKeys xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
         <errors>Error1</errors>
         <errors>Error2</errors>
      </ns1:CreateEntityTypesResponse>
   </soapenv:Body>
</soapenv:Envelope>

我有两个 nil 的 newKeys 元素,两个元素都插入了 xsi 的命名空间引用。我想将该命名空间包含在 soapenv:Envelope 元素中,以便命名空间引用只发送一次。

我正在使用 WSDL2Java 生成服务框架,因此我无法直接访问 Axis2 API。

【问题讨论】:

【参考方案1】:

使用 WSDL2Java

如果您使用过 Axis2 WSDL2Java 工具,那么您会被它为您生成的东西所困扰。但是,您可以尝试在本节中更改骨架:

   // create SOAP envelope with that payload
   org.apache.axiom.soap.SOAPEnvelope env = null;
   env = toEnvelope(
       getFactory(_operationClient.getOptions().getSoapVersionURI()),
       methodName,
       optimizeContent(new javax.xml.namespace.QName
       ("http://tempuri.org/","methodName")));

//adding SOAP soap_headers
_serviceClient.addHeadersToEnvelope(env);

要将命名空间添加到信封中,请在其中某处添加以下行:

OMNamespace xsi = getFactory(_operationClient.getOptions().getSoapVersionURI()).
    createOMNamespace("http://www.w3.org/2001/XMLSchema-instance", "xsi");

env.declareNamespace(xsi);

手工编码

如果您正在“手动编码”服务,您可能会执行以下操作:

SOAPFactory fac = OMAbstractFactory.getSOAP11Factory();   
SOAPEnvelope envelope = fac.getDefaultEnvelope();
OMNamespace xsi = fac.createOMNamespace("http://www.w3.org/2001/XMLSchema-instance", "xsi");

envelope.declareNamespace(xsi);
OMNamespace methodNs = fac.createOMNamespace("http://somedomain.com/wsinterface", "ns1");

OMElement method = fac.createOMElement("CreateEntityTypesResponse", methodNs);

//add the newkeys and errors as OMElements here...

在 aar 中暴露服务

如果您在 aar 内创建服务,您可能能够影响使用目标命名空间或模式命名空间属性生成的 SOAP 消息(请参阅this article)。

希望对您有所帮助。

【讨论】:

【参考方案2】:

其他选项是变量 MY_QNAME 的前缀为空。

public static final QName MY_QNAME = new QName("http://www.hello.com/Service/",
            "tagname",
            "prefix");

所以,如果你填写它,那么它就会起作用。

【讨论】:

以上是关于如何使用 Apache Axis2 和 WSDL2Java 向 SOAP 响应添加命名空间引用的主要内容,如果未能解决你的问题,请参考以下文章

apache axis2 生成客户端实体类

2.4 Apache Axis2 快速学习手册之XMLBeans 构建Web Service

如何使用 Axis WSDL2Java 生成的文件?

使用Apache CXF根据wsdl文件生成代码

Axis2根据wsdl文件生成本地Java代码

axis2的wsdl2java命令可以生成wsdl的服务端和客服端代码,请问各位大牛这个客服端和服务端的有啥区别。