调用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
相关产品推荐
相关产品推荐

