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批注
如果您的
更改
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的更多信息。