Как я могу перебрать вложенный список внутри тела Camel? - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь получить доступ к данным во входящем {теле} моего входящего Json. Я выполнил демаршалинг с Джексоном и сопоставил его с классом карты Java с помощью

  `.unmarshal().json(JsonLibrary.Jackson, java.util.Map.class)
`

Мои входящие данные Json выглядят примерно так, как только после неуместного шага выше

{ "projectId" : 12345,
"title" : “12345 - Plant 1 Processing",
"partners": [{"partnerName": "partnerJV1", "partnerLocation": "JA"},
{"partnerName": "partnerJV2", "partnerLocation": "FL"},
{"partnerName": "partnerJV3", "partnerLocation": "OH"}
]

Поле партнеров может содержать 0-N номеров partnerName, partnerLocation maps.

Теперь я вставляю это в таблицу SQL с

.to("sql:classpath:sql/sql_queries.sql")

Мой sql_queries.sql содержит следующий запрос для вставки полей данных в таблицу:

INSERT INTO MY_TABLE(PID, TITLE, PartnerName1, PartnerLocation1, PartnerName2, PartnerLocation2, PartnerName3, PartnerLocation3) VALUES(:#${body['projectId']}, :#${body['title']}, :#${body['partners[0]']['partnerName']}, :#${body['partners[0]']['partnerLocation']} )

Моя проблема в том, что я не могу знать точное число партнеров, и без него я не могу написать свое заявление SQL. Я получаю исключение IndexOutOfBounds, если получу доступ, скажем: # $ {body ['partners'] [2] ['partnerName']}

Но во входящем теле есть только один партнер.

Так как я могу в верблюде перебирать вложенную карту в моем JSON, основываясь на ее длине, и инициализировать поля PartnerName, PartnerLocation для моего оператора вставки?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Закончилось так:

               .process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    Map<String, Object> body = (Map<String, Object>) exchange.getIn().getBody();
                    int i = 1;
                    for(Map entry : (List<Map>)body.get("partners"))

                            {

                              exchange.setProperty("PartnerName"+i, entry.get("partnerName"));
                              exchange.setProperty("PartnerLocation"+i, entry.get("partnerLocation"));

                              i++;
                       }

Затем эти поля были использованы в INSERT INTO (... PartnerName1, PartnerLocation1, PartnerName2, PartnerLocation2 .....) VALUES (....: # $ {property.PartnerName1},: # $ {property. PartnerLocation1} ...)

0 голосов
/ 15 января 2019

Попробуй так:

            .setProperty("projectId", simple("body['projectId']"))
            .setProperty("title", simple("body['title']"))
            .setBody(simple("body['partners']"))
            .split(simple("body"))
            .process{//prepare your properties here}
            .end()
            .to("sql:classpath:sql/sql_queries.sql");

И sql будет выглядеть так:

INSERT INTO MY_TABLE(PID, TITLE, PartnerName1, PartnerLocation1, PartnerName2, PartnerLocation2, PartnerName3, PartnerLocation3) VALUES(:#${exchangeProperty.projectId}, :#${exchangeProperty.title}, :#${exchangeProperty.partnerName1}, :#${exchangeProperty.partnerLocation1} , :#${exchangeProperty.partnerName2}, :#${exchangeProperty.partnerLocation2}, :#${exchangeProperty.partnerName3}, :#${exchangeProperty.partnerLocation3}   )

UPD: для всех данных в 1 строке

...