2017-04-05 13 views
0

私はCamelのRESTエンドポイントをヒットしてそのデータをクラスに変換しようとしています(単純化し、そのクラスをJSON文字列に変換してテストするため)。私はすべてのことをするためにそれを得ることができますが、最終的な投稿を行い、ちょうどハングアップするようです。変換が行われない場合の処理​​

アプリケーション:

@SpringBootApplication 
public class App { 

    /** 
    * A main method to start this application. 
    */ 
    public static void main(String[] args) { 
     SpringApplication.run(App.class, args); 
    } 

    @Component 
    public class RestTest extends RouteBuilder { 
     @Override 
     public void configure() throws Exception { 
      restConfiguration().component("restlet").host("localhost").port(8000).bindingMode(RestBindingMode.json); 

      rest("/test").enableCORS(true) 
        .post("/post").type(User.class).to("direct:transform"); 

      from("direct:transform") 
        .transform().method("Test", "alter") 
        .to("http4:/localhost:8088/ws/v1/camel"); 
     } 
    } 

} 

豆:

@Component("Test") 
public class Test { 
    public void alter (Exchange exchange) { 
     ObjectMapper mapper = new ObjectMapper(); 

     User body = exchange.getIn().getBody(User.class); 

     try { 
      String jsonInString = mapper.writeValueAsString(body); 

      exchange.getOut().setHeader(Exchange.HTTP_METHOD, constant(HttpMethods.POST)); 
      exchange.getOut().setHeader(Exchange.CONTENT_TYPE, MediaType.APPLICATION_JSON); 
      exchange.getOut().setBody(jsonInString); 

     } catch (JsonGenerationException e) { 
      e.printStackTrace(); 
     } catch (JsonMappingException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

ユーザー:

public class User { 
    @JsonProperty 
    private String firstName; 

    @JsonProperty 
    private String lastName; 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 
} 

UPDATE

WOにそれを取得することができ

プロセスとrkが代わりの変換が、応答がPOSTからキャメルに返送されたエラー:

from("direct:transform") 
        .process(new Processor() { 
         public void process(Exchange exchange) throws Exception { 
          ObjectMapper mapper = new ObjectMapper(); 

          User body = exchange.getIn().getBody(User.class); 

          try { 
           String jsonInString = mapper.writeValueAsString(body); 

           exchange.getOut().setHeader(Exchange.HTTP_METHOD, constant(HttpMethods.POST)); 
           exchange.getOut().setHeader(Exchange.CONTENT_TYPE, MediaType.APPLICATION_JSON); 
           exchange.getOut().setBody(jsonInString); 

          } catch (JsonGenerationException e) { 
           e.printStackTrace(); 
          } catch (JsonMappingException e) { 
           e.printStackTrace(); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
         } 
        }) 
        .to("http4://0.0.0.0:8088/ws/v1/camel"); 

エラー

com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class org.apache.camel.converter.stream.CachedOutputStream$WrappedInputStream and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) 
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:284) 
    at com.fasterxml.jackson.databind.SerializerProvider.mappingException(SerializerProvider.java:1110) 
    at com.fasterxml.jackson.databind.SerializerProvider.reportMappingProblem(SerializerProvider.java:1135) 
    at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:69) 
    at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:32) 
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:292) 
    at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1429) 
    at com.fasterxml.jackson.databind.ObjectWriter._configAndWriteValue(ObjectWriter.java:1158) 
    at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:988) 
    at org.apache.camel.component.jackson.JacksonDataFormat.marshal(JacksonDataFormat.java:155) 
    at org.apache.camel.processor.MarshalProcessor.process(MarshalProcessor.java:69) 
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:109) 
    at org.apache.camel.processor.MarshalProcessor.process(MarshalProcessor.java:50) 
    at org.apache.camel.component.rest.RestConsumerBindingProcessor$RestConsumerBindingMarshalOnCompletion.onAfterRoute(RestConsumerBindingProcessor.java:363) 
    at org.apache.camel.util.UnitOfWorkHelper.afterRouteSynchronizations(UnitOfWorkHelper.java:154) 
    at org.apache.camel.impl.DefaultUnitOfWork.afterRoute(DefaultUnitOfWork.java:278) 
    at org.apache.camel.processor.CamelInternalProcessor$RouteLifecycleAdvice.after(CamelInternalProcessor.java:317) 
    at org.apache.camel.processor.CamelInternalProcessor$InternalCallback.done(CamelInternalProcessor.java:246) 
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:109) 
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197) 
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97) 
    at org.apache.camel.component.restlet.RestletConsumer$1.handle(RestletConsumer.java:68) 
    at org.apache.camel.component.restlet.MethodBasedRouter.handle(MethodBasedRouter.java:54) 
    at org.restlet.routing.Filter.doHandle(Filter.java:150) 
    at org.restlet.routing.Filter.handle(Filter.java:197) 
    at org.restlet.routing.Router.doHandle(Router.java:422) 
    at org.restlet.routing.Router.handle(Router.java:639) 
    at org.restlet.routing.Filter.doHandle(Filter.java:150) 
    at org.restlet.routing.Filter.handle(Filter.java:197) 
    at org.restlet.routing.Router.doHandle(Router.java:422) 
    at org.restlet.routing.Router.handle(Router.java:639) 
    at org.restlet.routing.Filter.doHandle(Filter.java:150) 
    at org.restlet.engine.application.StatusFilter.doHandle(StatusFilter.java:140) 
    at org.restlet.routing.Filter.handle(Filter.java:197) 
    at org.restlet.routing.Filter.doHandle(Filter.java:150) 
    at org.restlet.routing.Filter.handle(Filter.java:197) 
    at org.restlet.engine.CompositeHelper.handle(CompositeHelper.java:202) 
    at org.restlet.Component.handle(Component.java:408) 
    at org.restlet.Server.handle(Server.java:507) 
    at org.restlet.engine.connector.ServerHelper.handle(ServerHelper.java:63) 
    at org.restlet.engine.adapter.HttpServerHelper.handle(HttpServerHelper.java:143) 
    at org.restlet.engine.connector.HttpServerHelper$1.handle(HttpServerHelper.java:64) 
    at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:79) 
    at sun.net.httpserver.AuthFilter.doFilter(AuthFilter.java:83) 
    at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:82) 
    at sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(ServerImpl.java:675) 
    at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:79) 
    at sun.net.httpserver.ServerImpl$Exchange.run(ServerImpl.java:647) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

は、プロセスと変換の間の基本的な違いは何かという質問にリードしますか?

+0

なぜexchange.getOutの設定をしていますか?あなたはexchange.getInを使うことができます。 –

+0

@SoucianceEqdamRashti 'getIn'は、プロセッサを複数回実行させ、ポストリクエストを行わないようにします。 –

+0

これは起こらないはずですが、http4エンドポイントでbridgeEndpoint = trueを設定すると、プロデューサとコンシューマのhttpヘッダーが混在する可能性があります。それはexchange.getInで動作するはずです。あなたは何か似たようなものを見ることができますhttps://github.com/SoucianceEqdamRashti/Integration/blob/master/CamelDemo/src/main/java/org/souciance/integration/http/RedirectHTTP.java –

答えて

0

ラクダの「プロセッサ」は、最低レベルのメッセージ処理プリミティブです。カバーの下で変換定義はそれ自身プロセッサーであるorg.apache.camel.processor.TransformProcessorとして実行されます。実際には大部分はすべてプロセッサーであるため、厳密には純粋なプロセッサーで実現できる変換で達成できるものは何でもあります。

最後のエラーは、HTTP呼び出しの出力をオブジェクトにアンマーシャリングする必要があるためです。ジャクソンを使用してJSONにマーシャリングすることができます。次のようなものがあります:

from("direct:transform") 
    .transform().method("Test", "alter") 
    .to("http4:/localhost:8088/ws/v1/camel") 
    .unmarshal().json(JsonLibrary.Jackson, User.class); 
+0

トランスフォームを使うと私と同じ結果が得られます'getOut'の代わりに' getIn'を使用しています。それは 'to'に到達して決して解決しないときに' alter'メソッドを11回(yes、毎回11回)実行します。 '次のサーバー側タスクを実行できません:sun.net.httpserver.ServerImpl $ Exchange' –

関連する問題