2016-11-30 1 views
0

Ich bekomme ein JSON-Array als Eingabe von einem Rest-Schnittstelle, basierend auf Apache-Kamel-Funke. Zu Beginn möchte ich das JSON-Array aufteilen, um jedes einzelne Element über Apache-Kamel-Routen zu verarbeiten. Wie mache ich das?wie ein JSON-Array in Apache Kamel zu teilen

Mein Test-input-json:

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

Für dieses Problem fand ich einige Fragen auf Stackoverflow, die dies indirekt beschreiben:
link 1, link 2, link 3.

Basierend auf den Beispielen i folgende Kamel-Routen versucht:

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"); 

Wenn ich dies tun, erhalte ich immer die folgende Ausnahme:

ERROR DefaultErrorHandler - Fehlgeschlagen Lieferung (Meldungs : [...] auf ExchangeId: [...]). Erschöpft nach Zustellversuch: 1 gefangen: org.apache.camel.ExpressionEvaluationException: java.lang.NullPointerException

Ich habe den Grund nicht gefunden, was wong mit meinem Ausdruck? Ich habe es geändert, aber ich bekomme immer die NullPointerException.

Ich heruntergeladen JavaScript jsonPath library und testete die Ausdruck, der mir ein Array mit den beiden Objekten dient. Ich versuchte es auch in Kamel, das besagt, dass der Ausdruck gefunden wurde (true zurück) im Test-Eingabe-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"); 

Was ich falsch gemacht, warum ich die Nullpointer bekommen und wie tun geteilt i die Json?

Hier wird der vollständige 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

Wie starten/führen Sie Camel? Ich vermute, du tust das nicht richtig und der JSON-Ausdruck wird nicht mit seiner Engine initialisiert und du bekommst diese NPE. –

+0

Hi @ClausIbsen, danke für deine Antwort. Camel startet gut mit einem eingebetteten Jetty in camel-spark und andere Routen sind über den Browser zugänglich, wie zum Beispiel http: // localhost: 8080/v1/users/list. Für das Problem sende ich eine Postanfrage mit Postman, dann wird die oben gezeigte Route aufgerufen und ich bekomme die NPE. Ich starte Camel mit main.run() in einem eigenen Thread, wenn das vielleicht eine Nebenwirkung hat, was meinst du? – Zeussi

+0

In meiner pom.xml habe ich das Artefakt "camel-jsonpath" gesetzt. Der Doc sagt (http://camel.apache.org/jsonpath.html), das ist genug? – Zeussi

Antwort

2

Versuchen Sie, Ihre jsonpath Schaffung exprimierenden ähnlich wie:

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

und setzte sich in Ihre Split und versuchen. Ich habe auf diese Weise mehr Erfolg mit jsonpath gehabt, wenn ich verschiedene bedingte Bewertungen gemacht habe.

+0

Schön, das hat mein Problem gelöst. Vielen Dank! – Zeussi