Wso2 EnrichMediator:无法添加子级,因为目标不是JSON数组
我有一个这样的请求负载Wso2 EnrichMediator:无法添加子级,因为目标不是JSON数组,wso2,wso2esb,Wso2,Wso2esb,我有一个这样的请求负载 {"guest":{"name":{"firstName":"MARK","lastName":"DAVIS","middleInit":"G","title":"MR"},"addresses":[{"addressLine1":&q
{"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"/>
我在“roomInfo”中捕获该信息,并尝试使用Enrich将其附加到原始的“reservationsBody”JSON中
<property expression="json-eval($)" name="roomInfo" scope="default" type="STRING"/>
<payloadFactory media-type="json">
<format>$1</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>
我很困惑,因为它看起来确实像一个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"/>
因此,根据输出情况,您可以选择选项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"}]}},{"roomStays":[{"arrivalDate":"2020-07-20","departureDate":"2020-07-21","numAdults":1}]}]
<property expression="json-eval($.reservationBody)" name="reservationBody" scope="default" type="STRING"/>
<property expression="json-eval($)" name="roomInfo" scope="default" type="STRING"/>
<enrich>
<source clone="true" property="reservationBody" type="property"/>
<target type="body"/>
</enrich>
<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}]}