2016-11-30 2 views
0

Я получаю массив json в качестве входных данных из интерфейса rest, основанного на apd-apel-camel-spark. Вначале я хочу разбить json-массив для обработки каждого элемента индивидуально через маршруты верблюдов apache. Как я это делаю?Как разбить массив json в apache camel

Мой тест-вход-JSON:

[ 
    { 
     "document": { 
     "name": "blub1", 
     "type": "pdf" 
     } 
    }, 
    { 
     "document": { 
     "name": "blub2", 
     "type": "pdf" 
     } 
    } 
]; 

Для решения этой проблемы я нашел некоторые вопросы по StackOverflow, которые описывают это косвенно:
link 1, link 2, link 3.

Основываясь на примерах, я попытался следующие верблюдов маршруты:

restConfiguration().component("spark-rest").port(8080) 
    .bindingMode(RestBindingMode.json) 
    .dataFormatProperty("prettyPrint", "true"); 

rest("/v1/users").consumes("application/json").produces("application/json") 
    .post("/insert") 
    .to("direct:split"); 

from("direct:split") 
    .marshal().json(JsonLibrary.Jackson) 
    .split(new JsonPathExpression("$..document.")).process(new Processor() { 
     public void process(Exchange exchange) throws Exception { 
     String s = exchange.getIn().getBody(String.class); 
     System.out.println(s); 
     } 
    }).to("file:outbox"); 

Когда я делаю это, я получаю всегда следующее исключение:

ERROR DefaultErrorHandler - Сбой доставки для (MessageId : [...] на ExchangeId: [...]). Измученный после попытки доставки: 1 пойманы: org.apache.camel.ExpressionEvaluationException: java.lang.NullPointerException

я не нашел причину, Что вонг с моим выражением? Я изменил его, но всегда получаю исключение NullPointerException.

Я загрузил JavaScript jsonPath library и протестировал выражение $..document., которое служит мне массивом с двумя объектами. Я также попробовал его в верблюда, в котором говорится, что было найдено выражение (возвращает True) в тест-ввода-JSON:

from("direct:testExpression") 
     .marshal().json(JsonLibrary.Jackson) 
     .choice() 
      .when().jsonpath("$..document.", true) 
      .process(new Processor() { 
       public void process(Exchange exchange) throws Exception { 
       String payload = exchange.getIn().getBody(String.class); 
       exchange.getIn().setBody("true"); 
       System.out.println(payload); 
       } 
      }) 
      .to("file:outbox") 
     .otherwise() 
      .process(new Processor() { 
       public void process(Exchange exchange) throws Exception { 
       String payload = exchange.getIn().getBody(String.class); 
       exchange.getIn().setBody("false"); 
       System.out.println(payload); 
       } 
      }) 
      .to("file:outbox"); 

Что я не так, почему я получаю NullPointerException и как я разделить JSON?

Вот полный StackTrace:

org.apache.camel.ExpressionEvaluationException: java.lang.NullPointerException 
    at org.apache.camel.jsonpath.JsonPathExpression.evaluate(JsonPathExpression.java:95) ~[camel-jsonpath-2.18.0.jar:2.18.0] 
    at org.apache.camel.support.ExpressionAdapter.evaluate(ExpressionAdapter.java:36) ~[camel-core-2.18.0.jar:2.18.0] 
    at org.apache.camel.processor.Splitter.createProcessorExchangePairs(Splitter.java:113) ~[camel-core-2.18.0.jar:2.18.0] 
    at org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:231) ~[camel-core-2.18.0.jar:2.18.0] 
    at org.apache.camel.processor.Splitter.process(Splitter.java:108) ~[camel-core-2.18.0.jar:2.18.0] 
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) ~[camel-core-2.18.0.jar:2.18.0] 
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:542) [camel-core-2.18.0.jar:2.18.0] 
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197) [camel-core-2.18.0.jar:2.18.0] 
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197) [camel-core-2.18.0.jar:2.18.0] 
    at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:62) [camel-core-2.18.0.jar:2.18.0] 
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145) [camel-core-2.18.0.jar:2.18.0] 
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) [camel-core-2.18.0.jar:2.18.0] 
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:542) [camel-core-2.18.0.jar:2.18.0] 
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197) [camel-core-2.18.0.jar:2.18.0] 
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:120) [camel-core-2.18.0.jar:2.18.0] 
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:83) [camel-core-2.18.0.jar:2.18.0] 
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197) [camel-core-2.18.0.jar:2.18.0] 
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97) [camel-core-2.18.0.jar:2.18.0] 
    at org.apache.camel.component.sparkrest.CamelSparkRoute.handle(CamelSparkRoute.java:46) [camel-spark-rest-2.18.0.jar:2.18.0] 
    at spark.RouteImpl$1.handle(RouteImpl.java:58) [spark-core-2.3.jar:?] 
    at spark.webserver.MatcherFilter.doFilter(MatcherFilter.java:162) [spark-core-2.3.jar:?] 
    at spark.webserver.JettyHandler.doHandle(JettyHandler.java:61) [spark-core-2.3.jar:?] 
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189) [jetty-server-9.2.19.v20160908.jar:9.2.19.v20160908] 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) [jetty-server-9.2.19.v20160908.jar:9.2.19.v20160908] 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) [jetty-server-9.2.19.v20160908.jar:9.2.19.v20160908] 
    at org.eclipse.jetty.server.Server.handle(Server.java:499) [jetty-server-9.2.19.v20160908.jar:9.2.19.v20160908] 
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311) [jetty-server-9.2.19.v20160908.jar:9.2.19.v20160908] 
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) [jetty-server-9.2.19.v20160908.jar:9.2.19.v20160908] 
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544) [jetty-io-9.2.19.v20160908.jar:9.2.19.v20160908] 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) [jetty-util-9.2.19.v20160908.jar:9.2.19.v20160908] 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) [jetty-util-9.2.19.v20160908.jar:9.2.19.v20160908] 
    at java.lang.Thread.run(Thread.java:745) [?:1.8.0_101] 
Caused by: java.lang.NullPointerException 
    at org.apache.camel.jsonpath.JsonPathExpression.evaluateJsonPath(JsonPathExpression.java:118) ~[camel-jsonpath-2.18.0.jar:2.18.0] 
    at org.apache.camel.jsonpath.JsonPathExpression.evaluate(JsonPathExpression.java:88) ~[camel-jsonpath-2.18.0.jar:2.18.0] 
    ... 31 more 
+0

Как вы старте или управляете Верблюдом? Я подозреваю, что вы не делаете этого правильно, и выражение json не инициализируется его движком, и вы получаете этот NPE. –

+0

Hi @ClausIbsen, спасибо за ваш ответ. Camel начинает хорошо с встроенного Jetty в верблюжьей вспышке, а другие маршруты доступны через браузер, например, http: // localhost: 8080/v1/users/list. Для проблемы я отправляю сообщение с Postman, затем вызывается маршрут, показанный выше, и я получаю NPE. Я начинаю Camel wit main.run() в собственной теме, если это может быть побочный эффект, что вы имеете в виду? – Zeussi

+0

В моем pom.xml я установил артефакт «camel-jsonpath». Док говорит (http://camel.apache.org/jsonpath.html), этого достаточно? – Zeussi

ответ

2

Попробуйте создать свой jsonpath выразить подобное:

ExpressionBuilder.languageExpression("jsonpath","$..document.") 

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

+0

Ницца, это решило мою проблему. Большое спасибо! – Zeussi

Смежные вопросы