【问题标题】:How to dynamically add a json element using enrich mediator WSO2?如何使用丰富的中介 WSO2 动态添加 json 元素?
【发布时间】:2021-01-06 00:30:07
【问题描述】:

我尝试过使用

 <property name="messageType" scope="axis2" type="STRING" value="application/xml"/>
    <property expression="get-property('orderSourceSF')" name="orderSource" scope="default" type="STRING"/>
    <enrich description="">
        <source type="property"  property="orderSource"></source>
        <target action="child" xpath="$body//jsonObject"/>
    </enrich>
    <property name="messageType" scope="axis2" type="STRING" value="application/json"/>
    <payloadFactory media-type="json">
           <format>{request : $1}</format>
           <args>
               <arg evaluator="xml" expression="$body//jsonObject"/>
           </args>
       </payloadFactory>

这里我需要将一个名为 orderSouce 的元素添加到现有的有效负载中。我怎样才能插入那个元素。 现有的有效载荷是一个 json 请求。 我正在捕获 orderSource 的值,但不知道如何插入元素 orderSource 和值。

【问题讨论】:

    标签: javascript json wso2esb esb mediator


    【解决方案1】:

    我相信您可以使用如下中介来实现您的用例。

        <?xml version="1.0" encoding="UTF-8"?>
    <proxy xmlns="http://ws.apache.org/ns/synapse"
           name="enrichProxy"
           startOnLoad="true"
           statistics="disable"
           trace="disable"
           transports="http,https">
       <target>
          <inSequence>
             <property expression="json-eval($)"
                       name="orderSource"
                       scope="default"
                       type="STRING"/>
             <log>
                <property expression="json-eval($)" name="orderSource"/>
             </log>
             <call>
                <endpoint>
                   <address uri="http://run.mocky.io/v3/9cf4b844-57c1-4fa5-a101-881dc36385bd"/>
                </endpoint>
             </call>
             <log level="full"/>
             <property name="messageType"
                       scope="axis2"
                       type="STRING"
                       value="application/json"/>
             <enrich>
                <source clone="false" property="orderSource" type="property"/>
                <target action="child" xpath="json-eval($)"/>
             </enrich>
             <payloadFactory media-type="json">
                <format>{"request" : $1}</format>
                <args>
                   <arg evaluator="json" expression="$"/>
                </args>
             </payloadFactory>
             <respond/>
          </inSequence>
       </target>
       <description/>
    </proxy>
                                
    

    让我解释一下我在这里做了什么。由于您正在处理 JSON 有效负载,请在中介中使用 JSON 路径 [1] 而不是 XPATH。这样可以避免中介中不必要的数据转换。

    我们正在使用以下负载调用上述代理服务。

    {"orderSource":"value"}
    

    我们正在使用 JSON 路径捕获此有效负载,并将该值存储在属性中介 orderSource 中。然后我们进行端点调用,它将返回以下 JSON 负载。

    {"first":"response"}
    

    根据我的理解,您希望将属性中介的值作为子元素添加到第二个有效负载中。因此,通过丰富的中介,我们可以实现以下有效负载。

    {
            "first": "response",
            "orderSource": "value"
     }
    

    您似乎想将此生成的有效负载作为值添加到另一个 JSON 元素中,因此我使用了有效负载工厂调解器来实现此用例。因此,这将在负载工厂调解之后产生以下负载。

    {
        "request": {
            "first": "response",
            "orderSource": "value"
        }
    }
    

    [1]-https://docs.wso2.com/display/EI600/JSON+Support

    更新

    我已修改中介以使用 XPTH 函数而不是 JSON 路径。请参考以下示例配置。

    <?xml version="1.0" encoding="UTF-8"?>
    <proxy xmlns="http://ws.apache.org/ns/synapse"
           name="enrichProxy2"
           startOnLoad="true"
           statistics="disable"
           trace="disable"
           transports="http,https">
       <target>
          <inSequence>
             <property name="messageType"
                       scope="axis2"
                       type="STRING"
                       value="application/xml"/>
             <enrich>
                <source clone="true" xpath="$body//jsonObject/*"/>
                <target property="orderSource" type="property"/>
             </enrich>
             <call>
                <endpoint>
                   <address uri="http://run.mocky.io/v3/9cf4b844-57c1-4fa5-a101-881dc36385bd"/>
                </endpoint>
             </call>
             <enrich>
                <source clone="false" property="orderSource" type="property"/>
                <target action="child" xpath="//jsonObject"/>
             </enrich>
             <enrich>
                <source clone="true" xpath="//jsonObject"/>
                <target type="body"/>
             </enrich>
             <respond/>
          </inSequence>
       </target>
       <description/>
    </proxy>
               
    

    更新 2

    为防止自动数据转换,您需要在 [ESB_HOME]/repository/conf/synapse.properties 文件 [2] 中配置 synapse.commons.json.output.autoPrimitive = false。

    [2]-https://www.yenlo.com/blog/wso2torial-json-magic-in-wso2-esb-5.0.0

    【讨论】:

    • 谢谢夏娜卡。我正在使用旧版本的 wso2,其中无法直接丰富 json,因此转换为 XML。您能否在这里提供帮助,我们如何在旧版本的 wso2 中实现这一点
    • 再次感谢 Shanaka。我能够添加所需的元素。但是当我尝试将有效负载打到后端时,第一个字符串元素的双引号被遗漏了。可能是什么原因?
    • 我无法在本地观察到类似的问题。是否有可能丢失双引号的元素具有不同的数据类型,例如整数、布尔值
    • 没有 Shanaka,它本身就是一个 STRING 元素。我们使用丰富中介添加的元素没有转义引号。它是有效负载中的现有元素。问题是带有数字的字符串会自动转换为整数
    • 这是由于 ESB 服务器 [1] 中的 autoPrimitive 特性。这允许 XML 到 JSON 转换中的 JSON 输出中的原始类型。请参阅上述答案中提供的更新。 [1]-docs.wso2.com/display/EI640/Working+with+JSON+Message+Payloads
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多