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です。私はこのタイプの変換を設定する必要があり、誰かが正しい方向に私を向けることができるようになるために何かが欠けている。