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

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处理器提取值:

  1. 创建一个简单的工具类:
public class IdExtractor {
    public Integer extractId(Map<String, Object> row) {
        return (Integer) row.get("id");
    }
}
  1. 在路由中引入该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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:10:27