Apache Camel脚本读取body中caListID报错:Key未在InputStreamCache中找到
问题原因及解决办法
问题根源
从错误信息可明确,当前body的实际类型是InputStreamCache,并非解析后的JSON结构化对象(如Map或自定义POJO)。你在日志中看到的JSON字符串只是流被读取后打印的内容,但Camel此时并未将流解析为可通过OGNL路径直接访问的结构化数据,因此直接使用${body[caListID]}会提示键不存在。
解决步骤
必须先将输入的JSON流解析为结构化对象,才能正常访问字段:
方法1:解析为Map
在访问body字段前,添加unmarshal().json()步骤,把InputStreamCache转换为Map:
.log("message: ${body}") // 将JSON流解析为Map结构 .unmarshal().json(JsonLibrary.Jackson, Map.class) .setHeader(KafkaConstants.KEY, simple("${body[caListID]}")) .log("message: ${body[caListID]}")
方法2:绑定到自定义POJO
如果有对应业务实体类,可直接解析为POJO,访问更类型安全:
假设存在实体类ListInfo:
public class ListInfo { private Integer caListID; private Long ciqWatchListID; // 需提供getter/setter方法 }
路由代码调整为:
.log("message: ${body}") .unmarshal().json(JsonLibrary.Jackson, ListInfo.class) .setHeader(KafkaConstants.KEY, simple("${body.caListID}")) .log("message: ${body.caListID}")
注意事项
- 确保项目已引入Camel JSON组件依赖(如
camel-jackson),否则unmarshal().json()无法生效。 - 流对象只能被读取一次,若之前的日志操作已读取流,后续解析可能失败,可调整顺序为先解析再打印,或使用
cacheBody()缓存流内容。
内容的提问来源于stack exchange,提问作者Shasu
相关产品推荐
相关产品推荐

