Разделение строки Json и добавление объекта добавления в тело с использованием XML DSL в camel

#apache-camel #spring-camel #apache-camel-3

#apache-camel #spring-верблюд #apache-camel-3

Вопрос:

В одном из моих вариантов использования мне нужно разделить входящее сообщение 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», но когда я пытаюсь добавить дополнительный объект в окончательное тело exchange, у меня возникают некоторые проблемы с преобразованием объекта json в строку с использованием jsonpath.

ниже приведен маршрут, который будет вызываться для каждого сообщения.

 <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>    
  

Подход, который я попытался здесь, заключался в том, что перед фактическим разделением извлеките объект «information» из исходного сообщения и сохраните в свойстве exchange с именем «information», а затем после того, как произошло разделение, передайте это свойство из exchange и подготовьте тело, в котором создайте json с обоими «information» Объект «actualData».

все работает, как ожидалось, но проблема здесь в том, что когда объект «информация» сохраняется в поле свойств, он сохраняется не как строка, а как показано ниже.

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

ожидается, что он будет сохранен, как показано ниже.

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

из-за этой проблемы окончательное сообщение тела не становится строкой json. Может кто-нибудь, пожалуйста, помочь решить эту проблему? Заранее спасибо. Я использую версию camel 3.4.

Ответ №1:

Выполните сортировку после вашего ответа вместо преобразования в строку