Как добавить ссылку на пространство имен в ответ SOAP с помощью Apache Axis2 и WSDL2Java
Я смотрю на вывод 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>
У меня есть два элемента newKeys, которые имеют значение nil, и оба элемента вставляют ссылку на пространство имен для xsi. Я хотел бы включить это пространство имен в элемент soapapv:Envelope, чтобы ссылка на пространство имен отправлялась только один раз.
Я использую WSDL2Java для генерации каркаса сервиса, поэтому у меня нет прямого доступа к API Axis2.
2 ответа
Использование 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, вы можете повлиять на сообщение SOAP, созданное с помощью целевого пространства имен или свойств пространства имен схемы (см. Эту статью).
Надеюсь, это поможет.
Другой вариант состоит в том, что переменная MY_QNAME имеет префикс пустым.
public static final QName MY_QNAME = new QName("http://www.hello.com/Service/",
"tagname",
"prefix");
Итак, если вы заполните его, то это работает.