【问题标题】:WSO2ESB: Property setting not accepting empty valueWSO2ESB:属性设置不接受空值
【发布时间】:2017-09-16 02:54:23
【问题描述】:

实际上,当我在 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,
}}

【问题讨论】:

  • 您能告诉我您使用的是哪个版本的 ESB,以及您的 ParentInstanceID 属性的输出。如果我创建一个这样的属性然后记录它,我会在我的日志中得到一个空字符串,并且没有你显示的结果。
  • 嗨,我使用的是 WSO2 ESB 5.0.0,当我通过 JMS 发送它时会发生这种情况,我收到的 JSON 消息是空值,而不是当我为它们分配一个有效载荷工厂。
  • 你能展示你的payload工厂吗?如果它们不是空属性,它们是否应该保存字符串或整数?
  • 刚刚添加到主帖。

标签: wso2 wso2esb esb synapse


【解决方案1】:

我已经使用 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 解决方案,请告诉我。

谢谢。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回复,在这种情况下它也不起作用。它只适用于 JavaScript 脚本。我认为payloadFactory进行了从XML到JSON的一些转换,将“”值替换为空值。
    【解决方案3】:

    我已经尝试过您的 payloadFactory,结果证明它在 4.8.1 上就像一个魅力,但在 5.0.0 上却失败了。这很可能是他们在 ESB 中使用的 JSON 消息构建器的更改。问题不在于您的空属性,而在于您设置 messageType 属性时发生的从 XML 到 JSON 的自动转换。

    你可以做的就是让payload mediator立即创建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>
    

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

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

    【讨论】:

    • 太棒了!!!!非常感谢!!!我将您的回复标记为正确,但我有这个新帐户,并且在我获得 15 点声誉之前它不会被标记:(。无论如何,谢谢。
    【解决方案4】:
    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 2012-03-10
      • 1970-01-01
      • 2013-02-06
      • 2016-02-29
      • 1970-01-01
      相关资源
      最近更新 更多