【问题标题】:Apache camel with Spring DSL marshal to json issue带有 Spring DSL 编组到 json 问题的 Apache 骆驼
【发布时间】:2018-08-07 15:31:52
【问题描述】:

我有以下配置

<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.handleUnknownProperty(BeanDeserializerBase.java:1489) 在 com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1467) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:282) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:140) 在 com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3814) 在 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) 在 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) 在 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) 在 com.rabbitmq.client.impl.ConsumerWorkService$WorkPoolRunnable.run(ConsumerWorkService.java:100) 在 java.util.concurrent.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 更多

虽然我指定 marshal 使用 salesOrder 数据格式,但最终由于某种原因它使用 orderModel 数据格式,但我无法确定原因。

这就是 SalesOrderConverter 最后所做的事情

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

【问题讨论】:

    标签: spring-boot apache-camel spring-dsl


    【解决方案1】:

    如果您的 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 here.

    【讨论】:

    • 感谢您的信息,我尝试使用exchange.getIn().setBody(salesOrder, SalesOrder.class);,但仍然遇到同样的问题
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      相关资源
      最近更新 更多