Как добавить ссылку на пространство имен в ответ SOAP с помощью Apache Axis2 и WSDL2Java - PullRequest
8 голосов
/ 16 сентября 2008

Я смотрю на вывод 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 ]

7 голосов
/ 16 сентября 2008

Использование 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, созданное с помощью свойств целевого пространства имен или пространства имен схемы (см. эту статью ).

Надеюсь, это поможет.

1 голос
/ 22 июня 2012

Другой вариант: переменная MY_QNAME имеет префикс пустым.

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

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

...