2016-11-30 7 views
0

ond apache-camel-spark에 기반한 나머지 인터페이스에서 json 배열을 입력으로 얻습니다. 처음에는 json 배열을 분할하여 apache 낙타 경로를 통해 각 요소 개체를 처리하려고합니다. 내가 어떻게하는거야?apache 낙타에서 json 배열을 분할하는 방법

내 테스트 입력 JSON :
link 1, link 2, link 3 :이 문제에 대한

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

, 난이 간접적으로 설명 유래에 대한 몇 가지 질문을 발견했다. 나는이 작업을 수행 할 때

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. 표현을 테스트했습니다.이 표현은 나에게 두 객체의 배열을 제공합니다. 내가 NullPointerException이 얻을 방법과 이유, 내가 잘못합니까 내가 분할 무엇

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

: 나는 또한식이 테스트 입력-JSON에서 (True를 반환합니다)를 발견 한 것을 말한다 낙타에 그것을 시도 아들? 여기

전체 스택 트레이스 :

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

안녕하세요 @ClausIbsen, 답장을 보내 주셔서 감사합니다. Camel은 낙타의 스파크가 내장 된 Jetty에서 잘 시작하며 다른 경로는 http : // localhost : 8080/v1/users/list와 같은 브라우저를 통해 액세스 할 수 있습니다. 포스트 먼과 포스트 요청을 보내면 위에 표시된 경로가 호출되고 NPE를 얻습니다. 나는 카멜 재치 main.run()을 자신의 스레드에서 시작합니다. 이것이 부작용이 있다면, 당신은 무엇을 의미합니까? – Zeussi

+0

내 pom.xml에서 이슈를 "camel-jsonpath"로 설정했습니다. 의사가 (http://camel.apache.org/jsonpath.html) 말한다, 이것으로 충분합니까? – Zeussi

답변

2

유사한 표현하여 jsonpath를 만들어보십시오 :

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

및 분할에 그것을 넣어보십시오. 다양한 조건부 평가를 수행 할 때 jsonpath로이 방법으로 더 많은 성공을 거두었습니다.

+0

니스,이게 내 문제를 해결했습니다. 정말 고마워! – Zeussi