Объект Json в заголовке обмена Camel неправильно преобразован в строку - PullRequest
0 голосов
/ 07 июня 2019

Поэтому я пытаюсь разделить массив json с некоторыми метаданными и добавить метаданные к каждому объекту в массиве:

{
  "@version":"1",
  "metadata":{"key1":"value1","key2":"value2"},
  "messages":[{"msg":{...}},{"msg":{...}}, ... ]
}

к

{
  "type":"msg",
  "data":{
    "@version":"1",
    "metadata":{"key1":"value1","key2":"value2"},
    "msg":{...}
  }
}

У меня есть следующееВерблюжий маршрут, который почти работает:

from("direct:kafkaMsg")
    .routeId("rKafkaMsg")
    .log(DEBUG, "JSON: ${body}")
    .setHeader("@version").jsonpath("$.@version")
    .setHeader("metadata").jsonpathWriteAsString("$.metadata") // not writing as string
    .split().jsonpathWriteAsString("$.messages..msg")
        .setHeader("msgId", jsonpath("$.msgNo"))
        .setHeader("kafka.KEY", simple("${header.msgId}"))
        .setBody(simple("{\"type\":\"msg\","
            + "\"data\":{\"@version\":\"${header.@version}\",\"metadata\":${header.metadata},"
            + "\"msg\":${body}}}"))
        .log(DEBUG, "body: ${body}")
        .log(INFO, "msgPush: writing msg to kafka - msgId: ${header.msgId}")
        .setProperty(Exchange.CHARSET_NAME, constant("UTF-8"))
        .to("kafka:sometopic?partitioner=" + DefaultPartitioner.class.getName())
    .end();

Но Json, который я действительно получаю, выглядит так:

{
  "type":"msg",
  "data":{
    "@version":"1",
    "metadata":{key1="value1",key2="value2"},  // wrong. This looks like mapToString
    "msg":{...}
  }
}

Когда у меня был .split().jsonpath("$.messages..msg") ранее, объект 'msg' также был неверноотформатированный в выводе, но jsonpathWriteAsString() помог в этом случае.Я тоже попробовал jsonpath("$.metadata", String.class) но это не помогло.

Кто-нибудь знает, как это исправить?Благодаря.

1 Ответ

0 голосов
/ 07 июня 2019

Я решил это с помощью обходного пути с использованием процессора:

.split().jsonpath("$.messages..msg")
    .setHeader("msgId", jsonpath("$.msgNo"))
    .setHeader("kafka.KEY", simple("${header.msgId}"))
    // Processor instead of setBody()
    .process(exchange -> {
        JsonObject data = new JsonObject();
        data.put("@version", exchange.getIn().getHeader("@version"));
        data.put("metadata", exchange.getIn().getHeader("metadata"));
        data.put("msg", exchange.getIn().getBody());
        JsonObject body = new JsonObject();
        body.put("type", "msg");
        body.put("data", data);
        exchange.getOut().setBody(body.toJson());
        exchange.getOut().setHeaders(exchange.getIn().getHeaders());
    })

Я все равно предпочитаю это решение, потому что мне не нужно писать часть строки json самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...