1

我有以下配置

<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);
4

2 回答 2

1

无法识别的字段“SalesOrder”,因为您尚未在 pojo 中映射此字段。如果你不想映射,那么你也应该包含在你的 pojo 中并有注释 @JsonIgnore

于 2018-10-02T20:05:29.387 回答
0

如果您ExchangePattern设置为InOnly(看起来确实如此),则交换的 Out-part 将被丢弃。

改变

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

对此:

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

这样您就不必从 In-part 复制标题,因为它们已经存在。

您可以在此处阅读有关如何以及何时使用 getIn/getOut 的更多信息。

于 2018-02-28T08:23:08.660 回答