8

開発中の 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 である 2 つの newKeys 要素があり、両方の要素が xsi の名前空間参照を挿入します。名前空間参照が 1 回だけ送信されるように、その名前空間を soapenv:Envelope 要素に含めたいと思います。

私は WSDL2Java を使用してサービス スケルトンを生成しているため、Axis2 API に直接アクセスすることはできません。

4

2 に答える 2

7

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 メッセージに影響を与えることができる場合があります (この記事を参照してください)。

それが役立つことを願っています。

于 2008-09-16T18:00:28.863 に答える
1

他のオプションは、変数 MY_QNAME のプレフィックスを空にすることです。

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

したがって、それを満たせば機能します。

于 2012-06-22T19:17:37.570 に答える