Spring Boot下如何提取Camel消息体中的单一属性值
解决方案
修改路由提取单列值
直接在拆分后的路由节点中添加消息体转换逻辑,提取LinkedCaseInsensitiveMap中的id值作为新消息体即可,修改后的完整路由代码如下:
from("direct:test-input") .log(LoggingLevel.INFO, log, "Received message on test-input") .to("sql: select id from vac_openingen") .split(body()) .transform().simple("${body.id}") // 从Map中提取id值作为新消息体 .log(LoggingLevel.INFO, log, "Sending id: ${body} to queue") .to("jms:queue:test-messages") .end()
为什么会返回LinkedCaseInsensitiveMap?
camel-sql组件默认会将多行查询的每一行结果封装为LinkedCaseInsensitiveMap(Spring提供的大小写不敏感Map实现,兼容不同写法的列名),无论查询的是单列还是多列。文档中提到的“返回列对应类型”仅适用于单行单列查询场景(比如select id from vac_openingen where id = ?),这种情况下会直接返回单个值而非Map。你的场景是多行查询,因此返回的是List<Map>,拆分后每个元素就是单个Map对象。
其他可选方式
如果需要更类型安全的处理,可以使用Bean处理器提取值:
- 创建一个简单的工具类:
public class IdExtractor { public Integer extractId(Map<String, Object> row) { return (Integer) row.get("id"); } }
- 在路由中引入该Bean:
from("direct:test-input") .log(LoggingLevel.INFO, log, "Received message on test-input") .to("sql: select id from vac_openingen") .split(body()) .bean(IdExtractor.class, "extractId") .to("jms:queue:test-messages") .end()
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

