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
相关产品推荐
相关产品推荐

