#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:
Выполните сортировку после вашего ответа вместо преобразования в строку