【问题标题】:how to split a json array in apache camel如何在 apache camel 中拆分 json 数组
【发布时间】:2017-04-14 15:18:40
【问题描述】:

我从基于 apache-camel-spark 的 rest-interface 获得一个 json 数组作为输入。一开始,我想拆分 json-array 以通过 apache camels 路由处理每个元素。我该怎么做?

我的测试输入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");

当我这样做时,我总是得到以下异常:

错误 DefaultErrorHandler - (MessageId: [...] 在 ExchangeId 上:[...])。交付尝试后用尽:1 抓到:org.apache.camel.ExpressionEvaluationException: java.lang.NullPointerException

没找到原因,我的表情怎么了?我改变了它,但我总是得到 NullPointerException。

我下载了JavaScript jsonPath library 并测试了$..document. 表达式,它为我提供了一个包含两个对象的数组。我还在骆驼中尝试过,它说,在 test-input-json 中找到了表达式(返回 true):

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

【问题讨论】:

  • 如何启动/运行 Camel?我怀疑您没有正确执行此操作,并且 json 表达式未使用其引擎初始化,并且您得到了 NPE。
  • 您好@ClausIbsen,感谢您的回复。 Camel 以camel-spark 中的嵌入式Jetty 开始,并且可以通过浏览器访问其他路线,例如localhost:8080/v1/users/list。对于这个问题,我用 Postman 发送一个 post 请求,然后调用上面显示的路由,我得到了 NPE。我在自己的线程中启动 Camel wit main.run(),如果这可能有副作用,你是什么意思?
  • 在我的 pom.xml 中,我设置了工件“camel-jsonpath”。医生说 (camel.apache.org/jsonpath.html),这就够了吗?
  • 但是你如何从 Jetty 启动 Camel,例如你是做什么的。

标签: json rest split apache-camel jsonpath


【解决方案1】:

尝试创建您的 jsonpath,表达类似于:

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

并将其放入您的拆分中并尝试。在进行各种条件评估时,我在 jsonpath 方面取得了更大的成功。

【讨论】:

    猜你喜欢
    • 2018-05-27
    • 2022-08-19
    • 2018-12-10
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多