Camel unmarshall json путь к pojo - PullRequest
       46

Camel unmarshall json путь к pojo

0 голосов
/ 09 июля 2020

Я пытаюсь разобрать часть сообщения в pojo, чтобы обработать его в java. Сообщение содержит json, но мне нужна только его часть, поэтому я попытался использовать jsonpath, чтобы выбрать часть json, которая мне нужна, но потом я не могу демаршалировать, я также нашел метод для создания pojo прямо из jsonpath, но это возвращает null.

from(...)
.transform()
.jsonpath("@.data", false, POJO.class)
.process(...)
.end()

это оставляет мой POJO null.

from(...)
.transform.jsonpath("@.data")
.unmarshal().json(JsonLibrary.Jackson, POJO.class)
.process(...)
.end()

Это вызывает исключение:

Error processing exchange. Exchange[ID-5CD9519Z86-1594305984947-0-330]. Caused by: [org.apache.camel.InvalidPayloadException - No body available of type: java.io.InputStream but has value: {...}]
    at org.apache.camel.support.MessageSupport.getMandatoryBody(MessageSupport.java:118)
    at org.apache.camel.support.processor.UnmarshalProcessor.process(UnmarshalProcessor.java:58)
    at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:395)
    at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:148)
    at org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:60)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:147)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:286)
    at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:83)
    at org.apache.camel.support.AsyncProcessorSupport.process(AsyncProcessorSupport.java:40)
    at org.apache.camel.component.rabbitmq.RabbitConsumer.doHandleDelivery(RabbitConsumer.java:107)
    at org.apache.camel.component.rabbitmq.RabbitConsumer.handleDelivery(RabbitConsumer.java:82)
    at com.rabbitmq.client.impl.ConsumerDispatcher$5.run(ConsumerDispatcher.java:149)
    at com.rabbitmq.client.impl.ConsumerWorkService$WorkPoolRunnable.run(ConsumerWorkService.java:104)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:830)
Caused by: org.apache.camel.NoTypeConversionAvailableException: No type converter available to convert from type: java.util.LinkedHashMap to the required type: java.io.InputStream with value {...}
    at org.apache.camel.impl.converter.CoreTypeConverterRegistry.mandatoryConvertTo(CoreTypeConverterRegistry.java:216)
    at org.apache.camel.support.MessageSupport.getMandatoryBody(MessageSupport.java:116)
    ... 15 common frames omitted

What будет правильным способом справиться с этим.

Заранее спасибо,

Барт Лэреманс

1 Ответ

0 голосов
/ 09 июля 2020

В отличие от xpath, который создает String, библиотека jsonpath создает LinkedHashMap. Таким образом, вы пытаетесь демаршалировать LinkedHashMap, а не String.

например, исходное json: {"books":{"book": {"name": "Some Book"}}} ожидалось json: {"name": "Some Book"} выражение jsonpath: "$.books.book"

One ожидает получить {"name": "Some Book"}, поэтому unmarshaller создаст экземпляр BookDto. Но это не так.

Вы можете передать тип результата в jsonpath, чтобы он выдал BookDto вместо LinkedHashMap. Так что не нужно больше демаршалировать. (Как вы уже сделали)

Последний вариант у меня не работал.

String body = exchange.getMessage().getBody(String.class);
BookDto book = JsonPath.parse(body).read("$.books.book", BookDto.class);

book is null: (

Но это проблема библиотеки JsonPath и не верблюд

...