接手一个老项目,pom 里只有一条 jackson-databind,版本写着 2.9.6,跑起来报 NoSuchMethodError,堆栈指到 ObjectMapper 的构造方法上。
问题不在版本号,而在只引了一个包。Jackson 的核心拆成三块,databind 依赖 core 和 annotations,三者的版本必须对齐。
三个坐标各管什么
- jackson-core:流式解析,JsonParser 和 JsonGenerator 在这一层
- jackson-annotations:JsonProperty、JsonIgnore 这些注解
- jackson-databind:ObjectMapper,平时用得最多的那个
一般只写 databind 就够,Maven 会带出另外两个。但多模块项目里有人单独升了 core,版本错开,运行时就炸。
版本怎么定
Spring Boot 的 parent 已经把版本管住了,别自己再写 version。想升,改 spring-boot 的版本号,或者用 dependencyManagement 统一声明属性。
真要手动指定,三条一起写同一个版本,数字对不上纯属自找麻烦。JDK 8 用 2.13 及以下的线,JDK 17 建议 2.15 以上。
时间类型和模块
LocalDateTime 在旧版本里的默认行为是序列化成一串数组,看着像乱码。加 jackson-datatype-jsr310,注册 JavaTimeModule,再关掉按时间戳输出的那个开关,结果才是 ISO 格式。
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.17.2</version></dependency>还有一个常见坑:对方接口多返回一个字段,反序列化直接抛 UnrecognizedPropertyException。别急着加注解,先问清楚字段是不是长期的,再决定是忽略未知字段还是补实体。
排查版本冲突用 mvn dependency:tree,看 jackson 那几行打印出来的版本是不是一致。不一致就往上找,是谁带进来的旧版本包。
一句话:Jackson 的报错九成是拆分模块没对齐。别只盯着 databind 一个坐标,先看整棵依赖树。