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

调用Service A的Jetty端点时触发IndexOutOfBoundsException异常求助

问题原因

异常是因为Jetty端点接收HTTP请求时,默认将请求体封装成InputStreamCache流对象,而非解析后的结构化JSON数据。Simple表达式里的${body[data]}尝试通过OGNL访问流对象的data键,但流对象本身没有这个属性,因此抛出"未找到键:data"的错误。

解决方案

要解决这个问题,需要先将HTTP请求体的JSON流解析为可访问的结构化数据(比如Map或自定义POJO),步骤如下:

1. 添加JSON解析依赖

确保项目中引入Camel的Jackson JSON解析组件(Maven示例):

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jackson</artifactId>
    <version>${camel.version}</version> <!-- 与项目中Camel版本保持一致 -->
</dependency>

2. 修改路由,添加JSON解析步骤

在路由中加入unmarshal().json()处理器,将InputStreamCache转换为Map(或POJO),这样就能通过OGNL访问请求体中的字段:

方式一:解析为Map

from("jetty:http://0.0.0.0:6060/updateData")
      .log("Received update request: ${body}")
      // 将JSON请求体解析为Map类型
      .unmarshal().json(JsonLibrary.Jackson, Map.class)
      .setBody(simple("UPDATE my_table SET data = :#${body[data]} WHERE id = :#${body[id]}"))
      .to("sql:update") // 替换为实际的SQL数据源配置
      .setBody(simple("Data updated at ${date:now:yyyy-MM-dd HH:mm:ss}"))
      .to("direct:notifyServiceB");

// 通知Service B的路由
from("direct:notifyServiceB")
      .log("Notifying Service B")
      .to("http://localhost:8081/serviceB/notify")
      .log("Notification sent to Service B");

方式二:解析为自定义POJO(更安全)

定义一个匹配请求体结构的实体类:

public class UpdateRequest {
    private Integer id;
    private String data;

    // 必须提供无参构造器
    public UpdateRequest() {}

    // Getter和Setter方法
    public Integer getId() { return id; }
    public void setId(Integer id) { this.id = id; }
    public String getData() { return data; }
    public void setData(String data) { this.data = data; }
}

修改路由解析为POJO:

from("jetty:http://0.0.0.0:6060/updateData")
      .log("Received update request: ${body}")
      // 将JSON请求体解析为自定义POJO
      .unmarshal().json(JsonLibrary.Jackson, UpdateRequest.class)
      .setBody(simple("UPDATE my_table SET data = :#${body.data} WHERE id = :#${body.id}"))
      .to("sql:update") // 替换为实际的SQL数据源配置
      .setBody(simple("Data updated at ${date:now:yyyy-MM-dd HH:mm:ss}"))
      .to("direct:notifyServiceB");

// 通知Service B的路由
from("direct:notifyServiceB")
      .log("Notifying Service B")
      .to("http://localhost:8081/serviceB/notify")
      .log("Notification sent to Service B");

3. Postman请求注意事项

发送请求时必须设置Content-Type为application/json,并且请求体为JSON格式,示例:

{
  "id": 1001,
  "data": "updated_content"
}

内容的提问来源于stack exchange,提问作者AAYUSHI JAIN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:32:04