EnrichMediator:无法添加子项,因为目标不是 JSON 数组

EnrichMediator: Cannot add child, since the target is not a JSON array

我有一个这样的请求负载。

{"guest":{"name":{"firstName":"MARK","lastName":"DAVIS","middleInit":"G","title":"MR"},"addresses":[{"addressLine1":"4148 PINE HILL CV N","addressType":"home","city":"LAKELAND","country":"US","postalCode":"38002","state":"XX"},{"addressLine1":"522 South Road","addressType":"business","city":"Ploughkeepsie","company":"I B M","country":"US","postalCode":"12601","state":"NY"}],"emails":[{"emailAddress":"tom.smith@yahoo.com","emailType":"home"},{"emailAddress":"Tom@IBM.COM","emailType":"business"}],"phones":[{"phoneNumber":"0019013774041","phoneType":"home"},{"phoneNumber":"496196939781","phoneType":"business"}]}}

然后我在 属性 中捕获它。

<property expression="json-eval($.reservationBody)" name="reservationBody" scope="default" type="STRING"/>
<property expression="json-eval($)" name="reserveration-before" scope="default" type="STRING"/>

在此之后,我有一个不同的请求,如下所示:

{"roomStays":[{"arrivalDate":"2020-07-20","departureDate":"2020-07-21","numAdults":1}]}

我在“roomInfo”中捕获该信息并尝试使用 Enrich 将其附加到原始“reservationsBody”JSON。

<property expression="json-eval($)" name="roomInfo" scope="default" type="STRING"/>
  <payloadFactory media-type="json">
     <format></format>
     <args>
        <arg evaluator="xml" expression="get-property('reserveration-before')"/>
     </args>
  </payloadFactory>
  <enrich>
     <source clone="true" property="roomInfo" type="property"/>
     <target action="child" property="reservationBody" type="property"/>
  </enrich>

我将日志记录放在 Enrich 标签之前,我创建的 JSONs 看起来都很好,但是一旦我尝试丰富原始 JSON,我得到

ERROR - EnrichMediator Cannot add child, since the target {"guest":{"name":{"firstName":"MARK","lastName":"DAVIS","middleInit":"G","title":"MR"},"addresses":[{"addressLine1":"4148 PINE HILL CV N","addressType":"home","city":"LAKELAND","country":"US","postalCode":"38002","state":"XX"},{"addressLine1":"522 South Road","addressType":"business","city":"Ploughkeepsie","company":"I B M","country":"US","postalCode":"12601","state":"NY"}],"emails":[{"emailAddress":"tom.smith@yahoo.com","emailType":"home"},{"emailAddress":"Tom@IBM.COM","emailType":"business"}],"phones":[{"phoneNumber":"0019013774041","phoneType":"home"},{"phoneNumber":"496196939781","phoneType":"business"}]}} is not an JSON array

我很困惑,因为它看起来确实像一个 JSON 数组?抱歉,如果修复很明显,我是 WSO2 的新手。

首先回答你的问题下面不是JSON数组。因此,要解决您的问题,您有两种选择。

{"guest":{"name":{"firstName":"MARK","lastName":"DAVIS","middleInit":"G","title":"MR"},"addresses":[{"addressLine1":"4148 PINE HILL CV N","addressType":"home","city":"LAKELAND","country":"US","postalCode":"38002","state":"XX"},{"addressLine1":"522 South Road","addressType":"business","city":"Ploughkeepsie","company":"I B M","country":"US","postalCode":"12601","state":"NY"}],"emails":[{"emailAddress":"tom.smith@yahoo.com","emailType":"home"},{"emailAddress":"Tom@IBM.COM","emailType":"business"}],"phones":[{"phoneNumber":"0019013774041","phoneType":"home"},{"phoneNumber":"496196939781","phoneType":"business"}]}}

选项 1

您可以将上面的内容转换为 JSON 数组,然后再将其存储在 属性 中介程序中。您可以使用多种选项来做到这一点,例如使用有效负载工厂中介、丰富中介、属性 中介等。

[{"guest":{"name":{"firstName":"MARK","lastName":"DAVIS","middleInit":"G","title":"MR"},"addresses":[{"addressLine1":"4148 PINE HILL CV N","addressType":"home","city":"LAKELAND","country":"US","postalCode":"38002","state":"XX"},{"addressLine1":"522 South Road","addressType":"business","city":"Ploughkeepsie","company":"I B M","country":"US","postalCode":"12601","state":"NY"}],"emails":[{"emailAddress":"tom.smith@yahoo.com","emailType":"home"},{"emailAddress":"Tom@IBM.COM","emailType":"business"}],"phones":[{"phoneNumber":"0019013774041","phoneType":"home"},{"phoneNumber":"496196939781","phoneType":"business"}]}}]

但是生成的响应如下。

[{"guest":{"name":{"firstName":"MARK","lastName":"DAVIS","middleInit":"G","title":"MR"},"addresses":[{"addressLine1":"4148 PINE HILL CV N","addressType":"home","city":"LAKELAND","country":"US","postalCode":"38002","state":"XX"},{"addressLine1":"522 South Road","addressType":"business","city":"Ploughkeepsie","company":"I B M","country":"US","postalCode":"12601","state":"NY"}],"emails":[{"emailAddress":"tom.smith@yahoo.com","emailType":"home"},{"emailAddress":"Tom@IBM.COM","emailType":"business"}],"phones":[{"phoneNumber":"0019013774041","phoneType":"home"},{"phoneNumber":"496196939781","phoneType":"business"}]}},{"roomStays":[{"arrivalDate":"2020-07-20","departureDate":"2020-07-21","numAdults":1}]}]

选项 2

当你想要丰富的目标是属性时,会出现上述异常(参考[1]中的java代码)。当目标是 属性 时,它会检查目标 属性 是否包含 JSON 数组,如果不包含则抛出错误 [2].

因此,为了避免这种情况,您可以采用一些不同的方法来丰富有效载荷。

捕获属性中的负载

<property expression="json-eval($.reservationBody)" name="reservationBody" scope="default" type="STRING"/>
<property expression="json-eval($)" name="roomInfo" scope="default" type="STRING"/>

使用第一个有效负载 (reservationBody) 丰富消息上下文

 <enrich>
    <source clone="true" property="reservationBody" type="property"/>
    <target type="body"/>
 </enrich>

然后使用 roomInfo 属性 作为子元素丰富消息正文

<enrich>
            <source clone="true" property="roomInfo" type="property"/>
            <target action="child" xpath="json-eval($)"/>
</enrich>

然后生成的输出将如下所示

{"guest":{"name":{"firstName":"MARK","lastName":"DAVIS","middleInit":"G","title":"MR"},"addresses":[{"addressLine1":"4148 PINE HILL CV N","addressType":"home","city":"LAKELAND","country":"US","postalCode":"38002","state":"XX"},{"addressLine1":"522 South Road","addressType":"business","city":"Ploughkeepsie","company":"I B M","country":"US","postalCode":"12601","state":"NY"}],"emails":[{"emailAddress":"tom.smith@yahoo.com","emailType":"home"},{"emailAddress":"Tom@IBM.COM","emailType":"business"}],"phones":[{"phoneNumber":"0019013774041","phoneType":"home"},{"phoneNumber":"496196939781","phoneType":"business"}]},"roomStays":[{"arrivalDate":"2020-07-20","departureDate":"2020-07-21","numAdults":1}]}

因此,根据输出结果,您希望可以遵循选项 1 或选项 2

[1]-https://github.com/wso2/wso2-synapse/blob/master/modules/core/src/main/java/org/apache/synapse/mediators/elementary/Target.java#L437

[2]-https://github.com/wso2/wso2-synapse/blob/master/modules/core/src/main/java/org/apache/synapse/mediators/elementary/Target.java#L441