我有以下配置
<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);
答案 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.