2017-07-19 12 views
2

入力要求に応答配列を充実しますとてもシンプルなサービスです。つまり、その応答は非常に複雑で、配列やサブ配列(子配列)は非常に複雑です。要求アレイの対応する要素

バックエンドサービスの応答は、AggregateMediatorによって1つのsoap xmlに集約されます。以下は

は、私は入力要求を使用して以下のようなAggregateMediatorからの応答を超える豊かにしたいAggregateMediator

<?xml version='1.0' encoding='utf-8'?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     <Information> 
      <jsonObject> 
       <id>3</id> 
       <name>Mobile</name> 
       <model>S8</model> 
      </jsonObject> 
      <jsonObject> 
       <id>2</id>   
       <name>Car</name> 
       <model>Amaze</model> 
      </jsonObject> 
      <jsonObject> 
       <id>1</id> 
       <name>Home</name> 
       <area>5000sqft</area> 
      </jsonObject> 
     </Information> 
    </soapenv:Body> 
</soapenv:Envelope> 

からの応答です。 つまり、私はバックエンドサービスの入力要求と出力をマージしたい。(idはそれらの間で共通である。)

<?xml version='1.0' encoding='utf-8'?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     <Information> 
      <jsonObject> 
       <id>3</id> 
       <name>Mobile</name> 
       <model>S8</model> 
       <make>Samsung</make> 
      </jsonObject> 
      <jsonObject> 
       <id>2</id>   
       <name>Car</name> 
       <model>Amaze</model> 
       <make>Honda</make> 
      </jsonObject> 
      <jsonObject> 
       <id>1</id> 
       <name>Home</name> 
       <area>5000sqft</area> 
       <make>NAHB</make> 
      </jsonObject> 
     </Information> 
    </soapenv:Body> 
</soapenv:Envelope> 

私はバックエンドサービスを呼び出す前に、プロパティに入力要求配列を維持し、応答フローでそれにアクセスすることができました。 しかし、問題は "要求と応答の両方が配列"です。どのようにして2つの異なる配列で2つのforeachを同時に実行し、それぞれの配列要素を更新する前にidを一致させることができますか?

foreachTest.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<api context="/foreschTest" name="foreachTest" xmlns="http://ws.apache.org/ns/synapse"> 
    <resource methods="POST GET" uri-template="/hi"> 
     <inSequence> 
      <log level="full"/> 
      <log level="custom"> 
       <property expression="//jsonArray" name="message"/> 
      </log> 
      <property expression="//jsonArray" name="req" scope="default" type="STRING"/> 
      <foreach expression="//jsonArray/jsonElement" id="Loop"> 
       <sequence> 
        <property expression="get-property('Loop_FOREACH_COUNTER')" name="countid" scope="default" type="STRING"/> 
        <!-- <enrich> 
         <source clone="true" property="INCOMING_REQUEST" type="property"/> 
         <target type="body"/> 
        </enrich> 
        <enrich> 
         <source clone="true" type="inline"> 
          <id xmlns="">Y</id> 
         </source> 
         <target action="sibling" xpath="//jsonElement"/> 
        </enrich> --> 
        <!--<enrich> 
         <source clone="true" type="property" property="INCOMING_REQUEST"></source> 
         <target action="replace" type="body"></target> 
        </enrich> --> 
        <!-- Temporily commented <enrich> 
         <source clone="true" type="inline"> 
          <uniqueId xmlns="">Y</uniqueId> 
         </source> 
         <target action="child" xpath="//jsonElement/data[2]"/> 
        </enrich> 
        <enrich> 
         <source clone="true" property="countid" type="property"/> 
         <target xpath="//jsonElement/data[2]/uniqueId"/> 
        </enrich> --> 
        <log level="custom"> 
         <property expression="get-property('countid')" name="mgs7"/> 
        </log> 
        <log description="" level="custom"> 
         <property expression="get-property('Loop_FOREACH_ORIGINAL_MESSAGE')" name="mgs5"/> 
         <property expression="get-property('Loop_FOREACH_COUNTER')" name="mgs6"/> 
         <property expression="//jsonElement" name="msg8"/> 
        </log> 
        <log description="" level="custom"> 
         <property expression="//jsonElement/data[0]" name="msg9"/> 
         <property expression="//jsonElement/data[1]" name="msg10"/> 
         <property expression="//jsonElement/data[2]" name="msg11"/> 
        </log> 
       </sequence> 
      </foreach> 
      <iterate expression="//jsonArray/jsonElement" id="1"> 
       <target> 
        <sequence> 
         <log level="custom"> 
          <property name="msg2" value="&quot;Inside iterate&quot;"/> 
         </log> 
         <log level="full"/> 
         <send> 
          <endpoint key="modifyAgrRespEP"/> 
         </send> 
        </sequence> 
       </target> 
      </iterate> 
     </inSequence> 
     <outSequence> 
      <property name="info" scope="default"> 
       <Information xmlns=""/> 
      </property> 
      <aggregate id="1"> 
       <completeCondition> 
        <messageCount max="-1" min="-1"/> 
       </completeCondition> 
       <onComplete enclosingElementProperty="info" expression="//jsonObject"> 
        <log level="custom"> 
         <property name="msg3" value="&quot;Inside Aggr&quot;"/> 
        </log> 
        <log level="full"/> 
        <foreach expression="//Information/jsonObject"> 
         <sequence> 
          <log level="custom"> 
           <property name="msg4" value="&quot;Inside Foreach&quot;"/> 
          </log> 
          <property expression="$body" name="agr" scope="default" type="STRING"/> 
          <log level="custom"> 
           <property expression="get-property('agr')" name="agr"/> 
          </log> 
          <!-- <log level="full"/> --> 
         </sequence> 
        </foreach> 
       </onComplete> 
      </aggregate> 
     </outSequence> 
     <faultSequence/> 
    </resource> 
</api> 

modifyAgrRes.xml:ここ

<?xml version="1.0" encoding="UTF-8"?> 
<api context="/mod" name="modifyAgrRes" xmlns="http://ws.apache.org/ns/synapse"> 
    <resource methods="POST GET" uri-template="/aggr"> 
     <inSequence> 
      <log level="custom"> 
       <property name="message" value="&quot;Inside Modify Service *************************&quot;"/> 
      </log> 
      <log level="custom"> 
       <property expression="//jsonObject" name="location"/> 
      </log> 
      <switch source="//jsonObject/id"> 
       <case regex="1"> 
        <enrich> 
         <source clone="true" type="inline"> 
          <name xmlns="">Home</name> 
         </source> 
         <target action="child" xpath="//jsonObject"/> 
        </enrich> 
        <enrich> 
         <source clone="true" type="inline"> 
          <area xmlns="">5000sqft</area> 
         </source> 
         <target action="child" xpath="//jsonObject"/> 
        </enrich> 
       </case> 
       <case regex="2"> 
        <enrich> 
         <source clone="true" type="inline"> 
          <name xmlns="">Car</name> 
         </source> 
         <target action="child" xpath="//jsonObject"/> 
        </enrich> 
        <enrich> 
         <source clone="true" type="inline"> 
          <model xmlns="">Amaze</model> 
         </source> 
         <target action="child" xpath="//jsonObject"/> 
        </enrich> 
       </case> 
       <case regex="3"> 
        <enrich> 
         <source clone="true" type="inline"> 
          <name xmlns="">Mobile</name> 
         </source> 
         <target action="child" xpath="//jsonObject"/> 
        </enrich> 
        <enrich> 
         <source clone="true" type="inline"> 
          <model xmlns="">S8</model> 
         </source> 
         <target action="child" xpath="//jsonObject"/> 
        </enrich> 
       </case> 
       <default/> 
      </switch> 
      <log level="custom"> 
       <property expression="//jsonObject" name="msg20"/> 
      </log> 
      <enrich> 
       <source clone="true" xpath="//jsonObject"/> 
       <target type="body"/> 
      </enrich> 
      <log level="full"/> 
      <respond/> 
     </inSequence> 
     <outSequence> 
      <send/> 
     </outSequence> 
     <faultSequence/> 
    </resource> 
</api> 

答えて

0

は、高レベルの答えです。私はあなたがあなた自身のために外に詳細を働くことができますね。

  1. コピー入力($本体) で新しいプロパティ(inputBody)への$ CTX変換
  2. を開始:XMLにinputBodyを - のために、このURLを参照してください例:inputBody財産、および各行について、
  3. 新しいプロパティ
  4. に/ ID(currentId)および/メイク(currentMake)を取得します: https://docs.wso2.com/display/ESB481/Sample+440%3A+Converting+JSON+to+XML+Using+XSLT
  5. は、すべての中間処理が$ CTXて
  6. ループのステップでください
  7. 使用子を追加するには充実メディエーター /情報/ jsonObject [ID = $のCTX:currentId]:必要に応じてバックJSONに変換しcurrentMake
  8. / $ CTXに設定した値とします。

私は役立つことを望みます。

関連する問題