You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring DSL中unmarshal解析JSON数组引用Order类的正确用法

问题描述

基于Spring DSL编写Apache Camel路由,需求为调用API接口获取JSON列表数据,将JSON列表转换为对应Java对象后传入Processor执行后续业务处理。目前大部分逻辑已编写完成,但卡在unmarshal反序列化节点的配置环节,不清楚该位置如何正确引用Order类完成类型绑定。

现有路由定义
<route id="rod-marshal-to-bean">
    <from uri="timer://fetchData?repeatCount=1"/>
    <to uri="api:fetch1?filter=Rod_Filter1&batchSize=5&connection={{connection-info}}"/>
    <split>
        <simple>${body}</simple>
        <log message="Body is : ${body}"/>
        <unmarshal ..../>   <!-- 此处配置存在疑问 -->
        <process id="process1" ref="customProcessor"/>
    </split>
</route>
接口返回JSON数组样例
[
  {"version": 1, "sku": "HT-0001", "label": "NextGen-Rack ProSeries 1 Server"},
  {"version": 1, "sku": "HT-0002", "label": "NextGen-Rack ProSeries 2 Server"}
]
Order实体类代码
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.annotation.JsonIgnore;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

// 建议加上未知字段忽略配置,避免接口返回多余字段时报错
@JsonIgnoreProperties(ignoreUnknown = true)
class Order {
    @JsonProperty("version")
    private String version;
    
    @JsonProperty("sku")
    private String sku;
    
    @JsonProperty("label")
    private String label;

    String getVersion() {
        return version;
    }

    void setVersion(String version) {
        this.version = version;
        System.out.println("**** Setting version "+version);
    }

    String getSku() {
        return sku;
    }

    void setSku(String sku) {
        this.sku = sku;
        System.out.println("**** Setting sku "+sku);
    }

    String getLabel() {
        return label;
    }

    void setLabel(String label) {
        this.label = label;
        System.out.println("**** Setting label "+label);
    }
}
自定义Processor代码
import org.apache.camel.Exchange;
import org.apache.camel.Processor;

class CustomProcessor implements Processor {
    @Override
    void process(Exchange exchange) throws Exception {
        Order order = exchange.getIn().getBody(Order.class);
        // 执行自定义业务处理
    }
}
配置方案
  • 前置依赖确认:确保项目中已经引入camel-jackson依赖,Spring Boot项目直接引入camel-jackson-starter即可,框架会自动注册Jackson数据格式转换器。
  • unmarshal节点配置:路由中已经通过<split>将返回的JSON数组拆分为单个JSON对象,因此反序列化时直接指定目标类型为Order类的全限定名即可,配置如下:
<unmarshal>
    <jackson unmarshalType="com.yourpackage.Order"/>
</unmarshal>

注意将com.yourpackage替换为Order类实际所在的完整包路径,Camel加载类时必须使用全限定类名,仅写类名会抛出类找不到异常。

  • 代码修正点:
    • 贴出的Order类中,所有getter、setter方法内的语句末尾都缺失分号,会直接导致编译失败,需要补全。
    • 原日志中打印的{version=1, sku=HT-0001...}格式是Java Map的默认输出格式,不是标准JSON,不影响Jackson正常反序列化,无需额外处理。
  • 修正后完整的split片段:
<split>
    <simple>${body}</simple>
    <log message="Body is : ${body}"/>
    <unmarshal>
        <jackson unmarshalType="com.youractualpackage.Order"/>
    </unmarshal>
    <process id="process1" ref="customProcessor"/>
</split>

配置完成后,拆分后的单个JSON对象会自动被反序列化为Order实例,Processor中直接通过exchange.getIn().getBody(Order.class)即可获取转换完成的对象,不需要额外做类型转换。

内容的提问来源于stack exchange,提问作者R M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:06:28