2017-04-19 103 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>