如何使用 enrich mediator WSO2 动态添加 json 元素?

How to dynamically add a json element using enrich mediator WSO2?

我试过使用

 <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 : }</format>
           <args>
               <arg evaluator="xml" expression="$body//jsonObject"/>
           </args>
       </payloadFactory>

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

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

    <?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" : }</format>
            <args>
               <arg evaluator="json" expression="$"/>
            </args>
         </payloadFactory>
         <respond/>
      </inSequence>
   </target>
   <description/>
</proxy>
                            

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

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

{"orderSource":"value"}

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

{"first":"response"}

据我了解,您想将 属性 中介的值添加为第二个有效负载中的子元素。因此,通过 enrich mediator,我们可以实现以下 payload。

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

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

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

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

已更新

我修改了中介以使用 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