如何让Apache Camel Split兼容3.12版本,返回非数组JSON对象?
恢复Apache Camel 3.13+版本中Split处理JSON对象的旧行为
在Camel 3.13版本后,Split组件对非数组/集合类型的JSON对象处理逻辑发生了变更:原本会将整个对象作为单个拆分项,现在会遍历对象的所有键值对,将每个键值对作为独立拆分项。要在新版本中保留3.12的行为,无需大规模重构,可通过以下几种方式实现:
方法一:将目标对象包装为集合传递给Split
修改内层Split的表达式,把thingA对象包装成一个单元素集合,让Split遍历集合时直接返回整个对象:
from("file://read/some/file.json") .convertBodyTo(String.class) .unmarshal().json() .split(simple("${body.get('listOfthings')}")) // 将thingA对象包装为单元素列表,强制Split按整个对象拆分 .split(simple("[${body.get('thingA')}]")) .bean("processBodyBean");
这种方式完全兼容原有代码结构,仅修改内层Split的表达式即可,不会影响现有业务逻辑。
方法二:移除内层Split,直接传递对象
如果内层Split原本就只需要处理单个thingA对象,可直接去掉内层Split,通过表达式将对象传递给Bean:
from("file://read/some/file.json") .convertBodyTo(String.class) .unmarshal().json() .split(simple("${body.get('listOfthings')}")) .setBody(simple("${body.get('thingA')}")) .bean("processBodyBean");
这种方式更简洁,适合确认每个listOfthings元素中仅存在一个thingA对象的场景。
方法三:配置Split的迭代策略
通过split()方法的重载版本,指定使用单对象迭代器,强制将单个对象作为迭代源:
import org.apache.camel.util.Iterators; from("file://read/some/file.json") .convertBodyTo(String.class) .unmarshal().json() .split(simple("${body.get('listOfthings')}")) .split(exchange -> Iterators.single(exchange.getIn().getBody(Map.class).get("thingA"))) .bean("processBodyBean");
这种方式更灵活,适合需要自定义拆分逻辑的复杂场景。
内容的提问来源于stack exchange,提问作者Frank Jackson
相关产品推荐
相关产品推荐

