1

在我的一个用例中,我需要根据消息中可用的数组列表将入站 json 消息拆分为多条消息。

例如,在下面的消息拆分中,基于“actualData”数组列表进行。

{   
  "information": {
    "name": "ObjectName",
    "type": "messageType"   
   },   
  "actualData": [
    {
      "msg": "message-1"
    },
    {
      "msg": "message-2"
    }   
  ] 
}

拆分完成后,需要在每条消息中添加“信息”对象,然后再将其发送到下一个路由。这项工作需要在 XML DSL 本身中完成,而不是使用任何 java 处理器或 java 代码。

预期的结果需要是这样的:

拆分消息:1

{
  "information": {
    "name": "ObjectName",
    "type": "messageType"
  },
  "actualData": 
    {
      "msg": "message-1"
    }
}

拆分消息:2

{
  "information": {
    "name": "ObjectName",
    "type": "messageType"
  },
  "actualData": 
    {
      "msg": "message-2"
    }
}

问题陈述:

我能够根据“actualData”数组对象拆分消息,但是当我尝试在最终交换正文中添加附加对象时,我遇到了一些问题,无法使用 jsonpath 将 json 对象转换为字符串。

下面是将为每条消息调用的路由。

<route id="split_message">
<from uri="direct:split_message_onebyone"/>
<log message="Sending message body to split message one by one : ${body} "/>
<convertBodyTo type="java.lang.String"/>
<setProperty name="information">
    <jsonpath resultType="String" writeAsString="true">$.information</jsonpath>
</setProperty>
<log message="printing property after string message body to split message one by one : ${exchangeProperty.information}} "/>
<split streaming="true">
    <jsonpath>$.actualData</jsonpath>
    <marshal> <custom ref="jack" /> </marshal>
    <setBody>
        <simple>{{"information" : ${exchangeProperty.information}}, "actualData" : ${body}, } </simple>
    </setBody>
    <convertBodyTo type="java.lang.String"/>
</split>
<log message="split end one by one ${body}"/>
</route>    

我在这里尝试的方法是,在实际拆分发生之前,从原始消息中获取“信息”对象并以“信息”的名称存储到交换属性中,然后在拆分发生后,从交换中引用此属性并准备正文在其中创建一个包含“信息”+“实际数据”对象的 json。

一切都按预期工作,但这里的问题是,当“信息”对象存储在属性字段中时,它不会存储为字符串,而是存储如下。

{
    name: "ObjectName",
    type: "messageType"   
}

预计存储如下。

{
    "name": "ObjectName",
    "type": "messageType"   
 }

由于这个问题,最终的正文消息不会变成 json 字符串。有人可以帮忙解决这个问题吗?提前致谢。我正在使用骆驼 3.4 版本。

4

0 回答 0