WSO2ESB:属性设置不接受空值

时间:2017-04-19 18:09:36

标签: wso2 wso2esb esb synapse

实际上,当我在WSO2 ESB中使用空字符串在序列中设置属性时,我试图获取空值。我尝试了很多东西,但总能得到结果" null"或" \" \""而不是""当我拿到房产时,这是我的代码:

<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,
}}

4 个答案:

答案 0 :(得分:0)

我已经使用JavaScript实现了解决方法但是应该可以在属性介体中设置它,或者可以使用rich。

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

如果您获得XML解决方案,请告诉我。

感谢。

答案 1 :(得分:0)

另一种解决方案是使用“string”xpath函数:

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

答案 2 :(得分: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>

这样你就可以控制引号,除非你真的想要它,否则它永远不会把它放在那里。

希望这有助于解决您的问题

答案 3 :(得分: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>