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

Camel中多@JsonPath注解失效问题求助

解决Camel中Bean使用多个@JsonPath注解报错的问题

问题分析

你碰到的这个问题很典型:在Camel路由里直接用<jsonpath>标签提取多个JSON字段到请求头完全正常,但在Bean方法里同时加多个@JsonPath注解时,就抛出了PathNotFoundException,提示响应是java.lang.String而非JSON对象。

核心原因是:Camel默认会在处理第一个@JsonPath注解后,把消息体从原始的JSON对象转换成提取出的字符串值,后面的@JsonPath注解只能在这个字符串上解析,自然找不到_links这类JSON路径了。

解决方案

这里有几种实用的解决办法,你可以根据自己的Camel版本和编码习惯选择:

方法1:手动注入完整JSON体后解析

在Bean方法里先获取完整的JSON响应体,再用JsonPath库手动解析需要的字段,绕开消息体被修改的问题:

import com.jayway.jsonpath.JsonPath;

public void test(@Body String jsonBody) {
    String address = JsonPath.read(jsonBody, "$._links.collection/addresses.href");
    String availabilities = JsonPath.read(jsonBody, "$._links.collection/availabilities.href");
    // 你的业务逻辑处理
}

方法2:使用evalOnOriginal属性(Camel 2.20+支持)

从Camel 2.20版本开始,@JsonPath注解新增了evalOnOriginal属性,把它设为true,就能让每个注解都基于原始消息体解析,而不是前一个注解处理后的结果:

public void test(
    @JsonPath(value = "$._links.collection/addresses.href", evalOnOriginal = true) String address,
    @JsonPath(value = "$._links.collection/availabilities.href", evalOnOriginal = true) String availabilities
) {
    // 你的业务逻辑处理
}

这个方法最贴合你原本的编码习惯,只需要加个属性就能解决问题,优先推荐。

方法3:先转JSON为Java对象再传入Bean

在调用Bean之前,用Jackson或json-io组件把JSON响应转换成Map或者自定义POJO,Bean方法直接注入对象来取字段:

<route>
    <toD uri="http4://theCallingServiceUrl"/>
    <!-- 把JSON转成Map -->
    <unmarshal>
        <json library="Jackson"/>
    </unmarshal>
    <bean method="test"/>
</route>

对应的Bean方法:

public void test(@Body Map<String, Object> responseMap) {
    Map<String, Object> links = (Map<String, Object>) responseMap.get("_links");
    String address = ((Map<String, String>) links.get("collection/addresses")).get("href");
    String availabilities = ((Map<String, String>) links.get("collection/availabilities")).get("href");
    // 你的业务逻辑处理
}

验证建议

如果你的Camel版本在2.20及以上,直接用方法2最省心;版本较低的话,方法1或方法3都能解决问题。

内容的提问来源于stack exchange,提问作者Themis Pyrgiotis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:42:03