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
我有一个这样的请求负载。
{"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