我有以下配置
<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,但是在编组消息时出现错误
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“SalesOrder”(com.orders.OrderModel 类),在 [来源:java.io.ByteArrayInputStream@4eac8add;未标记为可忽略;行:1,列:16](通过参考链:com.orders.OrderModel["SalesOrder"])在 com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:62) 在 com.fasterxml。 jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:834) 在 com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1093) 在 com.fasterxml.jackson.databind.deser.BeanDeserializerBase。 com.fasterxml.jackson.databind.deser.BeanDeserializerBase 处的 handleUnknownProperty(BeanDeserializerBase.java:1489)。ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:748) 被抑制:com.fasterxml。 jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“SalesOrder”(com.orders.OrderModel 类),在 [来源:java.io.ByteArrayInputStream@4a931757;未标记为可忽略;行:1,列:16](通过引用链:com.orders.OrderModel["SalesOrder"]) ... 25 更多 (com.orders.OrderModel 类),在 [Source: java.io.ByteArrayInputStream@4a931757; 处未标记为可忽略;行:1,列:16](通过引用链:com.orders.OrderModel["SalesOrder"]) ... 25 更多 (com.orders.OrderModel 类),在 [Source: java.io.ByteArrayInputStream@4a931757; 处未标记为可忽略;行:1,列:16](通过引用链:com.orders.OrderModel["SalesOrder"]) ... 25 更多
虽然我指定 marshal 使用 salesOrder 数据格式,但最终由于某种原因它使用 orderModel 数据格式,但我无法确定原因。
这就是 SalesOrderConverter 最后所做的
exchange.getOut().setHeaders(exchange.getIn().getHeaders());
exchange.getOut().setBody(salesOrder, SalesOrder.class);