带有Spring DSL编组的Apache骆驼到json问题

时间:2018-02-27 21:06:36

标签: spring-boot apache-camel spring-dsl

我有以下配置

<dataFormats>
        <json id="orderModel" library="Jackson" objectMapper="com.camel.CustomObjectMapper"
              unmarshalTypeName="com.orders.OrderModel"/>
        <json id="salesOrder" library="Jackson" objectMapper="com.camel.CustomObjectMapper"
              unmarshalTypeName="com.camel.model.salesorder.SalesOrder"/>
</dataFormats>

<route id="orderTranslateToSalesOrder">
        <from ref="orderPlaced"/>
        <unmarshal ref="orderModel" />
        <process ref="customerProcessor" />
        <process ref="salesOrderConverter"/>
        <marshal ref="salesOrder"/>
        <inOnly ref="orderCreate" />
        <process ref="history"/>
</route>

我从orderPlaced读取,这是一个兔子队列,然后将对象解组为OrderModel,然后执行两个进程,其中第二个进程将正文对象类型从OrderModel更改为SalesOrder,但是当编组消息时我收到错误< / p>

  

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段&#34; SalesOrder&#34; (类com.orders.OrderModel),未标记为可忽略    在[来源:java.io.ByteArrayInputStream@4eac8add; line:1,column:16](通过引用链:com.orders.OrderModel [&#34; SalesOrder&#34;])       at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:62)       在com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:834)       at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1093)       在com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1489)       在com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1467)       at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:282)       在com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:140)       at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3814)       at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2924)       在org.apache.camel.component.jackson.JacksonDataFormat.unmarshal(JacksonDataFormat.java:185)       在org.apache.camel.processor.UnmarshalProcessor.process(UnmarshalProcessor.java:69)       at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:76)       在org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548)       在org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)       在org.apache.camel.processor.Pipeline.process(Pipeline.java:138)       在org.apache.camel.processor.Pipeline.process(Pipeline.java:101)       在org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)       at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97)       在org.apache.camel.component.rabbitmq.RabbitConsumer.doHandleDelivery(RabbitConsumer.java:99)       在org.apache.camel.component.rabbitmq.RabbitConsumer.handleDelivery(RabbitConsumer.java:74)       在com.rabbitmq.client.impl.ConsumerDispatcher $ 5.run(ConsumerDispatcher.java:149)       at com.rabbitmq.client.impl.ConsumerWorkService $ WorkPoolRunnable.run(ConsumerWorkService.java:100)       在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)       at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)       在java.lang.Thread.run(Thread.java:748)       抑制:com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段&#34; SalesOrder&#34; (类com.orders.OrderModel),未标记为可忽略    在[来源:java.io.ByteArrayInputStream@4a931757; line:1,column:16](通过引用链:com.orders.OrderModel [&#34; SalesOrder&#34;])           ......还有25个

虽然我指定编组人员使​​用salesOrder数据格式,但在最后由于某种原因处理时它使用的是orderModel数据格式,但我无法确定原因。

这是SalesOrderConverter最后所做的事情

exchange.getOut().setHeaders(exchange.getIn().getHeaders());
exchange.getOut().setBody(salesOrder, SalesOrder.class);

2 个答案:

答案 0 :(得分:1)

无法识别的字段“ SalesOrder”,因为您尚未在pojo中映射此字段。如果您不想地图,那么还应该将其包含在pojo中并使用@JsonIgnore注释

答案 1 :(得分:0)

如果您的ExchangePattern设置为InOnly(看起来是这样),您的交易所的Out-part将被丢弃。

更改

exchange.getOut().setHeaders(exchange.getIn().getHeaders());
exchange.getOut().setBody(salesOrder, SalesOrder.class);

对此:

exchange.getIn().setBody(salesOrder, SalesOrder.class);

这样你就不必从部分复制你的标题,因为它们已经在那里了。

您可以详细了解如何以及何时使用getIn / getOut here.