2017-04-19 105 views
0

其實我試圖獲得一個空值,當我在一個空字符串的WSO2 ESB序列中設置屬性。我已經嘗試了很多事情,但總是能得到結果「無效」或「\」 \「」,而不是「」當我得到的財產,這裏是我的代碼:WSO2ESB:屬性設置不接受空值

<property value="&quot;&quot;" 
name="arq.general.DestinationSystem" scope="default" 
type="STRING" xmlns:ns="http://org.apache.synapse/xsd" 
xmlns:ns2="http://org.apache.synapse/xsd"/> 
<property name="arq.general.ParentInstanceID" scope="default" 
type="STRING" value=""/> 
<property expression="get-property('NonExistentProperty')" 
name="arq.functional.User" 
scope="default" type="STRING" 
xmlns:ns="http://org.apache.synapse/xsd" 
xmlns:ns2="http://org.apache.synapse/xsd"/> 

請你能幫助?

乾杯,

託尼

++的有效載荷廠:

<payloadFactory media-type="xml"> 
      <format> 
       <MensajeAuditoria xmlns=""> 
        <Timestamp>$1</Timestamp> 
        <TrackingID>$2</TrackingID> 
        <SourceApplication>$3</SourceApplication> 
        <OperationName>$4</OperationName> 
        <ParentInstanceID>$5</ParentInstanceID> 
        <InstanceID>$6</InstanceID> 
        <ServiceID>$7</ServiceID> 
        <FunctionalID>$8</FunctionalID> 
        <AdapterType>$9</AdapterType> 
        <AdapterPoint>$10</AdapterPoint> 
        <HostName>$11</HostName> 
        <User>$12</User> 
       </MensajeAuditoria> 
      </format> 
      <args> 
       <arg evaluator="xml" expression="get-property('SYSTEM_TIME')"/> 
       <arg evaluator="xml" expression="get-property('arq.general.TrackingID')"/> 
       <arg evaluator="xml" expression="get-property('arq.general.SourceApplication')"/> 
       <arg evaluator="xml" expression="get-property('arq.functional.OperationName')"/> 
       <arg evaluator="xml" expression="get-property('arq.general.ParentInstanceID')"/> 
       <arg evaluator="xml" expression="get-property('arq.general.InstanceID')"/> 
       <arg evaluator="xml" expression="get-property('arq.general.ServiceID')"/> 
       <arg evaluator="xml" expression="get-property('arq.functional.FunctionalID')"/> 
       <arg evaluator="xml" expression="get-property('arq.general.AdapterType')"/> 
       <arg evaluator="xml" expression="$func:AdapterPoint"/> 
       <arg evaluator="xml" expression="get-property('SERVER_IP')"/> 
       <arg evaluator="xml" expression="get-property('arq.functional.User')"/> 

      </args> 
     </payloadFactory> 
    </else> 
</filter> 
<property name="messageType" scope="axis2" type="STRING" value="application/json"/> 

添加工廠結果:

{ 
"MensajeAuditoria": { 
    "Timestamp": 1492777451830, 
    "TrackingID": "76b9858d-8421-4d7e-d2af-e8e411382e2e", 
    "SourceApplication": "API Manager", 
    "OperationName": null, 
    "ParentInstanceID": null, 
    "InstanceID": "76b9858d-8421-4d7e-d2af-e8e411382e2e", 
    "ServiceID": "PRX_PROY1_AEX_AltaCliente", 
    "FunctionalID": null, 
    "AdapterType": "AEXP", 
    "AdapterPoint": "PreActRequest", 
    "HostName": "172.16.3.97", 
    "User": null, 
}} 
+0

你能告訴我,也是輸出是做什麼用的ParentInstanceID財產。如果我創建了一個這樣的屬性,然後記錄它,我會在我的日誌中獲得一個空字符串,並且沒有顯示任何結果。 – ophychius

+0

嗨,我正在使用WSO2 ESB 5.0.0,它發生在我通過JMS發送它時,我收到的JSON消息是空值,而不是「」,當我爲它們分配一個payloadFactory。 –

+0

你可以展示你的有效載荷工廠嗎?如果他們不是空的屬性,他們應該舉行字符串,或整數例如? – ophychius

回答

0

我已經實現了一個變通使用JavaScript,但應該可以將其設置在財產調解員中,或者可以使用充實。

<script language="js"><![CDATA[var payload = mc.getPayloadJSON(); 
if(payload.MensajeAuditoria.ParentInstanceID== null){ 
    payload.MensajeAuditoria.ParentInstanceID="";  
} 
mc.setPayloadJSON(payload); 
mc.setProperty("MyProperty","");]]></script> 

如果您獲得了XML解決方案,請告訴我。

謝謝。

0

的其他解決方案是使用「字符串」 XPath函數:

<property name="arq.general.ParentInstanceID" expression="string('')"/> 
+0

感謝您的回覆,在這種情況下,它也沒有工作。它只能通過JavaScript腳本運行。我認爲payloadFactory會將XML轉換爲JSON,將「」值替換爲空值。 –

0

我已經試過你payloadFactory和原來它就像在4.8.1魅力,但它在5.0.0失敗。這很可能是他們在ESB中使用的JSON消息構建器的一個變化。問題不在於您的空屬性,而在於設置messageType屬性時發生的XML自動轉換爲JSON。

,你能做些什麼來解決這個問題雖然是有效載荷調停創建JSON馬上如下補充:

<payloadFactory media-type="json"> 
      <format> 
       {"MensajeAuditoria":{ 
        "Timestamp":$1, 
        "TrackingID":"$2" 
        ... 
       } 
       } 

      </format> 
      <args> 
       <arg evaluator="xml" expression="get-property('SYSTEM_TIME')"/> 
       <arg evaluator="xml" expression="get-property('arq.general.TrackingID')"/> 
       ... 
      </args> 
     </payloadFactory> 
    </else> 
</filter> 

這樣你在報價的控制,並且它永遠不會把空那裏,除非你真的想在那裏。

希望這有助於解決您的問題,您正在使用該ESB的版本

+0

太棒了!非常感謝你!!!我標記你的回覆是正確的,但我有這個新帳戶,它不會被標記,直到我有15點的聲譽:(。謝謝你。 –

0
Good thing would be to use enrich mediator to map the json field to xml field if there is a vale for the incoming field. 
Sample 
     <filter regex="true" source="boolean(get-property('START_DATE'))"> 
     <then> 
      <enrich description="Add startDate tag"> 
      <source clone="true" type="inline"> 
       <org:startDate xmlns:org="urn:example.com/service/org"/> 
      </source> 
      <target action="child" xpath="//*[local-name()=get-property('RequestType')]"/> 
      </enrich> 
      <enrich description="populate startDate"> 
      <source clone="true" property="START_DATE" type="property"/> 
      <target 
       xmlns:org="urn:example.com/servi`enter code here`ce/org" xpath="//org:startDate"/> 
      </enrich> 
     </then> 
     <else/> 
     </filter>