2016-09-21 4 views
0

enrich DSLを使用して休憩サービスを呼び出し、結果をメッセージ本文に集約するルート(ラクダ2.17.3)があります。私はシリアル化の問題に遭遇しています。ここに私がしようとしているものがあります。私のルートは、次のようになります。AggregationStrategyでメッセージ本文をpojoに変換する方法

rest("myService").produces("application/json") 
      .get("test") 
      .param().name("text").required(true).type(RestParamType.query).description("The text to be processed.").endParam() 
       .to("direct:StepA") 
    ; 

    from("direct:StepA") 
      .removeHeader("CamelHttpQuery") 
      .removeHeader("CamelHttpRawQuery") 
      .enrich("netty4-http://myOtherService:8080/endpoint?input=${header.text}", new MyAggregator()) 
      .to("direct:StepB") 
    ; 

    from("direct:StepB") 
      // not really implemented yet 
      .transform().simple("Query: ${header.text}\nBody: ${body}") 
    ; 

見ての通り、私はさらなる処理のために新しいメッセージ体を形成するには、それらの結果を、いくつかの既存のサービスを呼び出すと集約するエンリッチ()DSLを使用します。その残りの呼び出しの結果をJsonからMyResponseに変換する必要があります。私はこれを使用したい:

.unmarshal().json(JsonLibrary.Jackson, MyResponse.class) 

しかし、私はそれは、すでにこのようになります私のAggregationStrategy、内アンマーシャル必要があります。これは、nullを返します

public class MyAggregator implements AggregationStrategy { 
    @Override 
    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { 
     final MyResponse intermediateResponse = oldExchange.getIn().getBody(MyResponse.class); 

     final MyAggregate response = new MyAggregate(oldExchange.getIn().getHeader("text", String.class), intermediateResponse); 

     newExchange.getIn().setBody(response); 
     return newExchange; 
} 

、しかし、私はgetBodyを(言うとき.. )。だから私はTypeConvertersについて学んだと、システムが自動的に私のタイプに変換することができるようにそれを使用しようとしました:

public class MyConverter extends TypeConverterSupport { 

    private static final ObjectMapper MAPPER = 
     new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT); 

    @Override 
    public <T> T convertTo(Class<T> type, Exchange exchange, Object value) throws TypeConversionException { 
     try { 
      return (T)MAPPER.readValue(value.toString(), MyResponse.class); 
     } catch (IOException e) { 
      throw new TypeConversionException(value, type, e); 
     } 
} 

そして中に私のメイン:

public static void main(String... args) throws Exception { 
     Main main = new Main(); 
     main.setApplicationContextUri("classpath:app-ctx.xml"); 

     for (final CamelContext ctx : main.getCamelContexts()) { 
      ctx.getTypeConverterRegistry().addTypeConverter(MyResponse.class, String.class, new MyConverter()); 
     } 

     main.run(args); 
    } 

しかし、これは結果を変更するには表示されません。 。私のAggregatorでは、MyResponseはまだnullです。私はこのタイプの変換を設定する必要があり、誰かが正しい方向に私を向けることができるようになるために何かが欠けている。

答えて

0

は私がちょうどアンマーシャリングの呼び出しをしたサブルートを豊かにして、それを集約することができると気づいたとき、私はこれを通じて働くことになった[OK]を...

from("direct:StepA") 
     .removeHeader("CamelHttpQuery") 
     .removeHeader("CamelHttpRawQuery") 
     .enrich("direct:StepAEnricher", new MyAggregator()) 
     .to("direct:StepB") 
; 

from("direct:StepAEnricher") 
    .toD("netty4-http://myOtherService:8080/endpoint?input=${header.text}") 
    .unmarshal().json(JsonLibrary.Jackson, MyResponse.class) 
; 

は、これは完璧に動作します!私はもっ​​と味付けしたラクダの開発者がこれについてどのように考えているのか不思議です。このようなレスポンスをアンマーシャリングするだけでは、この "余分な"ルートを持つのはコストがかかりますか?カスタムタイプコンバータのアプローチをどのように克服したか、私はまだ不思議です。

関連する問題