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

SpringBoot 2.2.7集成Camel 3.11.2出现Jackson ObjectMapper NoSuchMethodError报错

问题背景

我正在搭建项目并配置简单的POST路由,代码如下:

rest("/as2/")
    .post("invoice")
    .description("Receive invoice for sending to AS2")
    .param().name("body").type(RestParamType.body).description("Post message").endParam()
    .route().id("as2-post-route").log("${body}");

该应用需要接收XML格式的发票数据,转换后发送至外部系统。初始阶段我仅需要接收输入字符串并打印内容,但调用接口时触发如下错误:

org.apache.camel.CamelExecutionException: Exception occurred during execution on the exchange: Exchange[]
    at org.apache.camel.CamelExecutionException.wrapCamelExecutionException(CamelExecutionException.java:45) ~[camel-api-3.11.2.jar:3.11.2]
    at org.apache.camel.support.AbstractExchange.setException(AbstractExchange.java:589) ~[camel-support-3.11.2.jar:3.11.2]
    at org.apache.camel.support.DefaultExchange.setException(DefaultExchange.java:27) ~[camel-support-3.11.2.jar:3.11.2]
    at org.apache.camel.support.processor.UnmarshalProcessor.process(UnmarshalProcessor.java:81) ~[camel-support-3.11.2.jar:3.11.2]
    at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:83) ~[camel-base-engine-3.11.2.jar:3.11.2]
    at org.apache.camel.support.AsyncProcessorSupport.process(AsyncProcessorSupport.java:41) ~[camel-support-3.11.2.jar:3.11.2]
    at org.apache.camel.processor.RestBindingAdvice.unmarshal(RestBindingAdvice.java:307) ~[camel-core-processor-3.11.2.jar:3.11.2]
    at org.apache.camel.processor.RestBindingAdvice.before(RestBindingAdvice.java:142) ~[camel-core-processor-3.11.2.jar:3.11.2]
    at org.apache.camel.processor.RestBindingAdvice.before(RestBindingAdvice.java:51) ~[camel-core-processor-3.11.2.jar:3.11.2]
    at org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:340) ~[camel-base-engine-3.11.2.jar:3.11.2]
    at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:83) ~[camel-base-engine-3.11.2.jar:3.11.2]
    at org.apache.camel.support.AsyncProcessorSupport.process(AsyncProcessorSupport.java:41) ~[camel-support-3.11.2.jar:3.11.2]
    at org.apache.camel.http.common.CamelServlet.doExecute(CamelServlet.java:319) ~[camel-http-common-3.11.2.jar:3.11.2]
    at org.apache.camel.http.common.CamelServlet.doService(CamelServlet.java:214) ~[camel-http-common-3.11.2.jar:3.11.2]
    at org.apache.camel.http.common.CamelServlet.service(CamelServlet.java:130) ~[camel-http-common-3.11.2.jar:3.11.2]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.34.jar:9.0.34]
    ... 省略非核心堆栈
Caused by: java.lang.NoSuchMethodError: 'java.lang.Object com.fasterxml.jackson.databind.ObjectReader.readValue(java.io.InputStream, java.lang.Class)'
    at org.apache.camel.component.jackson.AbstractJacksonDataFormat.unmarshal(AbstractJacksonDataFormat.java:185) ~[camel-jackson-3.11.2.jar:3.11.2]
    at org.apache.camel.support.processor.UnmarshalProcessor.process(UnmarshalProcessor.java:64) ~[camel-support-3.11.2.jar:3.11.2]
    ... 45 common frames omitted

我使用的JDK版本为Java 11,初步判断是依赖库冲突导致的,求可行的解决方案。


解决方案

错误根因

报错核心是java.lang.NoSuchMethodError,本质是Camel 3.11.2依赖的Jackson版本与项目中其他引入的Jackson版本不兼容:Camel 3.11.2要求Jackson版本不低于2.12.x,而项目中存在更低版本的Jackson包,低版本ObjectReader没有对应入参的readValue重载方法,导致调用失败。

可行修复方案

  • 统一Jackson依赖版本
    首先通过mvn dependency:tree(Maven项目)或gradle dependencies(Gradle项目)命令查看当前项目所有Jackson相关依赖的版本,将jackson-core、jackson-databind、jackson-annotations、jackson-dataformat-xml的版本统一升级到2.12.6(和Camel 3.11.2适配的稳定版本,不建议跨大版本升级避免新的兼容问题)。如果是Spring Boot项目,可直接在配置属性中指定jackson.version=2.12.6覆盖Spring Boot默认的Jackson版本。
  • 关闭Rest自动绑定逻辑
    初始阶段仅需要打印原始请求字符串,不需要自动反序列化的情况下,可以直接在Rest路由配置中关闭自动绑定,完全绕开Jackson反序列化逻辑,修改路由代码如下:
    restConfiguration().bindingMode(RestBindingMode.off); // 新增关闭自动绑定配置
    
    rest("/as2/")
        .post("invoice")
        .description("Receive invoice for sending to AS2")
        .param().name("body").type(RestParamType.body).description("Post message").endParam()
        .route().id("as2-post-route").log("${body}");
    
    配置后Camel不会尝试解析请求体,直接将原始字符串传递到后续节点,适合快速验证功能。
  • 排除冲突的低版本Jackson
    如果有第三方依赖强制引入了低版本Jackson,可在对应依赖的声明中排除Jackson相关构件,让Camel引入的适配版本Jackson生效。

修复完成后重新构建启动项目,调用接口验证控制台是否正常打印请求体,无报错即为修复成功。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 15:18:01