问题描述
我正在查看我正在开发的 Web 服务的 SOAP 输出,我注意到一些奇怪的事情:
I'm looking at the SOAP output from a web service I'm developing, and I noticed something curious:
<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 元素中包含该命名空间,以便命名空间引用仅发送一次.
I have two newKeys elements that are nil, and both elements insert a namespace reference for xsi. I'd like to include that namespace in the soapenv:Envelope element so that the namespace reference is only sent once.
我使用 WSDL2Java 来生成服务框架,所以我不能直接访问 Axis2 API.
I am using WSDL2Java to generate the service skeleton, so I don't directly have access to the Axis2 API.
推荐答案
使用 WSDL2Java
如果您使用过 Axis2 WSDL2Java 工具,您就会对它为您生成的内容感到困惑.但是,您可以尝试更改本节中的骨架:
Using WSDL2Java
If you have used the Axis2 WSDL2Java tool you're kind of stuck with what it generates for you. However you can try to change the skeleton in this section:
// 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);
要将命名空间添加到信封,请在其中某处添加以下几行:
To add the namespace to the envelope add these lines somewhere in there:
OMNamespace xsi = getFactory(_operationClient.getOptions().getSoapVersionURI()).
createOMNamespace("http://www.w3.org/2001/XMLSchema-instance", "xsi");
env.declareNamespace(xsi);
手工编码
如果您对服务进行手工编码",您可能会执行以下操作:
Hand-coded
If you are "hand-coding" the service you might do something like this:
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 消息(请参阅 这篇文章).
希望有所帮助.
这篇关于如何使用 Apache Axis2 和 WSDL2Java 向 SOAP 响应添加命名空间引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!