Spring DSL封送的Apache骆驼到JSON问题

Apache camel with Spring DSL marshal to json issue

我有以下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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: Unrecognized field"SalesOrder" (class com.orders.OrderModel), not marked as ignorable
at [Source: java.io.ByteArrayInputStream@4eac8add; line: 1, column: 16] (through reference chain: com.orders.OrderModel["SalesOrder"])
at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:62)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:834)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1093)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1489)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1467)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:282)
at 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)
at org.apache.camel.component.jackson.JacksonDataFormat.unmarshal(JacksonDataFormat.java:185)
at org.apache.camel.processor.UnmarshalProcessor.process(UnmarshalProcessor.java:69)
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:76)
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548)
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:138)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:101)
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97)
at org.apache.camel.component.rabbitmq.RabbitConsumer.doHandleDelivery(RabbitConsumer.java:99)
at org.apache.camel.component.rabbitmq.RabbitConsumer.handleDelivery(RabbitConsumer.java:74)
at com.rabbitmq.client.impl.ConsumerDispatcher$5.run(ConsumerDispatcher.java:149)
at com.rabbitmq.client.impl.ConsumerWorkService$WorkPoolRunnable.run(ConsumerWorkService.java:100)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
Suppressed: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field"SalesOrder" (class com.orders.OrderModel), not marked as ignorable
at [Source: java.io.ByteArrayInputStream@4a931757; line: 1, column: 16] (through reference chain: com.orders.OrderModel["SalesOrder"])
... 25 more

尽管我指定了元帅使用salesOrder数据格式,但由于某种原因在处理事务时最终使用了orderModel数据格式,但是我无法确定原因。

这就是SalesOrderConverter最后所做的

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

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


如果您的ExchangePattern设置为InOnly(看起来像这样),则交换的外部将被丢弃。

更改

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

对此:

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

这样,您将不必从In-part中复制标题,因为它们已经在那里。

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