升级Jackson-core至2.17.2后readValue()方法报错求助
Jackson 2.17.2升级后readValue()反序列化报错排查方案
可能的原因及解决方法:
- 依赖版本不统一
Jackson的核心组件(jackson-core、jackson-databind、jackson-annotations)必须保持版本一致,2.17.2版本对组件兼容性要求更严格。如果仅升级了jackson-core,其他组件仍停留在2.15.2,会引发序列化逻辑冲突。
解决:在build.gradle中统一所有Jackson相关依赖的版本:
ext.jacksonVersion = '2.17.2' dependencies { implementation "com.fasterxml.jackson.core:jackson-core:${jacksonVersion}" implementation "com.fasterxml.jackson.core:jackson-databind:${jacksonVersion}" implementation "com.fasterxml.jackson.core:jackson-annotations:${jacksonVersion}" // 其他Jackson衍生依赖(如jackson-datatype-jsr310等)也需同步版本 }
Bean类序列化规则不兼容
Jackson 2.16+调整了部分默认行为,比如默认开启FAIL_ON_UNKNOWN_PROPERTIES(未识别字段触发报错),而旧版本可能默认关闭。若Bean类与JSON字符串存在字段不匹配,会触发反序列化失败。
解决:- 给Bean类添加注解忽略未识别字段:
@JsonIgnoreProperties(ignoreUnknown = true) public class Bean { // 类字段及方法 }- 或在ObjectMapper中显式配置兼容规则:
ObjectMapper objectMapper = new ObjectMapper() .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) .configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true); Bean bean = objectMapper.readValue(event.getBody(), Bean.class);API Gateway返回的Body格式问题
升级后Jackson对JSON格式校验更严格,若event.getBody()返回的是Base64编码字符串(API Gateway部分场景下的默认行为),直接反序列化会报错;或者Body本身存在JSON语法错误(如未转义的特殊字符)。
解决:- 先打印
event.getBody()内容,确认是否为合法JSON; - 若为Base64编码,先解码再反序列化:
String decodedBody = new String(Base64.getDecoder().decode(event.getBody())); Bean bean = new ObjectMapper().readValue(decodedBody, Bean.class);- 先打印
基础语法错误
你的代码中new ObjectMapper.readValue存在语法错误,正确的调用方式应为new ObjectMapper().readValue()(缺少实例化括号),升级后编译器或运行时可能对语法校验更严格,触发报错。
修正后的代码:
APIGatewayProxyResponseEvent event = new APIGatewayProxyResponseEvent(); Bean bean = new ObjectMapper().readValue(event.getBody(), Bean.class);
内容的提问来源于stack exchange,提问作者MANPREET KAUR
相关产品推荐
相关产品推荐

