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

升级Jackson至2.18.2后遇NoSuchMethodError,求非降级解决方案

问题:Jackson升级至2.18.2后出现NoSuchMethodError错误

问题背景

将Jackson从2.16.1升级至2.18.2后,调用工具类的toJsonString方法时抛出方法不存在的错误。

相关依赖配置(build.gradle)

plugins {
    id 'java'
    id 'jacoco'
    id 'com.github.johnrengelman.shadow' version '8.1.1'
    id "org.sonarqube" version "${sonarqubeVersion}"
}

ext {
    awsLambdaJavaCoreVersion = '1.2.3'
    awsLambdaEventsVersion = '3.12.0'
    jacksonDatabindVersion = '2.18.2'
    awsLambdaTransformerVersion = '3.1.0'
    guavaVersion = '33.2.1-jre'
    javaJwtVersion = '4.4.0'
}

dependencies {
    implementation project(":fdx-6")
    implementation (project(":common")) {
        exclude group: 'org.springframework.boot'
        exclude group: 'software.amazon.awssdk', module: 'url-connection-client'
    }
    implementation "software.amazon.awssdk:sqs"
    implementation "software.amazon.awssdk:lambda"
    implementation "org.springframework:spring-web"
    implementation "org.springframework.security:spring-security-core:6.2.5"
    implementation "com.amazonaws:aws-lambda-java-core:$awsLambdaJavaCoreVersion"
    implementation "com.amazonaws:aws-lambda-java-events:$awsLambdaEventsVersion"
    implementation "com.amazonaws:aws-lambda-java-events-sdk-transformer:$awsLambdaTransformerVersion"
    implementation "com.amazonaws:aws-lambda-java-log4j2:1.6.0"
    implementation 'com.amazonaws:dynamodb-lock-client:1.2.0'
    implementation 'software.amazon.awssdk:dynamodb-enhanced'
    implementation "com.fasterxml.jackson.core:jackson-core:$jacksonDatabindVersion"
    implementation "com.fasterxml.jackson.core:jackson-databind:$jacksonDatabindVersion"
    implementation "com.fasterxml.jackson.module:jackson-module-afterburner:$jacksonDatabindVersion"
    implementation "com.nimbusds:nimbus-jose-jwt:${nimbusJoseVersion}"
    implementation "io.netty:netty-codec-http:${nettyHttpVersion}"
    implementation "com.google.guava:guava:$guavaVersion"
    implementation "com.auth0:java-jwt:$javaJwtVersion"
    implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonDatabindVersion"
    implementation "com.nimbusds:nimbus-jose-jwt:${nimbusJoseVersion}"
    //opentelemetry
    compileOnly "io.opentelemetry:opentelemetry-api"
    compileOnly "io.opentelemetry.instrumentation:opentelemetry-aws-lambda-events-2.2:${opentelemetryInstrumentationVersionAlpha}"
    compileOnly "io.opentelemetry.instrumentation:opentelemetry-aws-sdk-2.2:${opentelemetryInstrumentationVersionAlpha}"
    implementation "io.opentelemetry.instrumentation:opentelemetry-java-http-client:${opentelemetryInstrumentationVersionAlpha}"
    implementation "com.amazonaws:aws-lambda-java-log4j2:1.6.0"
    implementation 'org.apache.logging.log4j:log4j-layout-template-json:2.17.1'

    compileOnly "org.projectlombok:lombok"
    implementation "org.mapstruct:mapstruct:${mapStructVersion}"
    annotationProcessor "org.projectlombok:lombok"
    annotationProcessor "org.mapstruct:mapstruct-processor:${mapStructVersion}"

    testImplementation 'com.amazonaws:aws-lambda-java-tests:1.1.1'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation "org.mapstruct:mapstruct:${mapStructVersion}"
    testImplementation 'uk.org.webcompere:system-stubs-jupiter:2.1.6'
    testImplementation "io.opentelemetry.instrumentation:opentelemetry-aws-sdk-2.2:${opentelemetryInstrumentationVersionAlpha}"
}

Java工具类代码

@UtilityClass
public class ObjectMapperUtil {

    public static final TypeReference<HashMap<String, Object>> STRING_OBJ_TYPE_REF = new TypeReference<>() {
    };
    public static final TypeReference<HashMap<String, String>> STRING_STRING_TYPE_REF = new TypeReference<>() {
    };

    private static final ObjectMapper objectMapper = JsonMapper.builder()
            .addModule(new JavaTimeModule())
            .addModule(new AfterburnerModule())
            .build();

    public static String toJsonString(Object obj) {
        try {
            return objectMapper.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            throw new RuntimeException("Error converting object to JSON", e);
        }
    }
}

报错信息

java.lang.NoSuchMethodError: 'void com.fasterxml.jackson.core.util.BufferRecycler.releaseToPool()'

    at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:4059)
    at com.c.o.common.utils.ObjectMapperUtil.toJsonString(ObjectMapperUtil.java:29)

解决方案(不降级依赖)

这个错误的核心原因是Jackson核心组件版本不一致:jackson-core的运行版本低于2.18.2,而jackson-databind已经升级到2.18.2,新版本databind调用了core中新增的releaseToPool()方法,但旧版本core没有该方法。

具体解决步骤:

  1. 排查依赖冲突
    在项目根目录执行Gradle命令,查看所有引入jackson-core的依赖及版本:

    ./gradlew dependencies --configuration compileClasspath | grep jackson-core
    

    重点关注第三方依赖(如AWS SDK、Spring组件)引入的旧版本jackson-core。

  2. 强制统一所有Jackson组件版本
    在build.gradle中添加版本强制配置,确保所有Jackson相关依赖都使用2.18.2:

    configurations.all {
        resolutionStrategy.force "com.fasterxml.jackson.core:jackson-core:${jacksonDatabindVersion}"
        resolutionStrategy.force "com.fasterxml.jackson.core:jackson-annotations:${jacksonDatabindVersion}"
        // 若使用其他Jackson模块,同步强制版本
        resolutionStrategy.force "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:${jacksonDatabindVersion}"
        resolutionStrategy.force "com.fasterxml.jackson.module:jackson-module-afterburner:${jacksonDatabindVersion}"
    }
    

    该配置会覆盖所有第三方依赖引入的旧版本Jackson组件,保证版本完全一致。

  3. 验证依赖一致性
    再次执行依赖树命令,确认所有jackson-core的版本均为2.18.2:

    ./gradlew dependencies --configuration compileClasspath | grep jackson-core
    
  4. 清理并重新构建
    清理旧构建缓存,重新编译打包:

    ./gradlew clean build
    

补充说明

  • BufferRecycler.releaseToPool()是Jackson 2.18.x新增的方法,必须保证jackson-core与jackson-databind版本严格匹配。
  • 第三方依赖经常会自带旧版本Jackson,通过Gradle的resolutionStrategy.force是解决这类版本冲突的高效方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 19:42:02