升级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没有该方法。
具体解决步骤:
排查依赖冲突
在项目根目录执行Gradle命令,查看所有引入jackson-core的依赖及版本:./gradlew dependencies --configuration compileClasspath | grep jackson-core重点关注第三方依赖(如AWS SDK、Spring组件)引入的旧版本
jackson-core。强制统一所有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组件,保证版本完全一致。
验证依赖一致性
再次执行依赖树命令,确认所有jackson-core的版本均为2.18.2:./gradlew dependencies --configuration compileClasspath | grep jackson-core清理并重新构建
清理旧构建缓存,重新编译打包:./gradlew clean build
补充说明
BufferRecycler.releaseToPool()是Jackson 2.18.x新增的方法,必须保证jackson-core与jackson-databind版本严格匹配。- 第三方依赖经常会自带旧版本Jackson,通过Gradle的
resolutionStrategy.force是解决这类版本冲突的高效方式。
内容的提问来源于stack exchange,提问作者Sergey Tsypanov
相关产品推荐
相关产品推荐

