Как добавить ссылку на пространство имен в ответ 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");

Итак, если вы заполните его, то это работает.

Другие вопросы по тегам