返回对象时报 JsonApplyView 缺类:先对齐 Jackson 依赖
Spring Boot 4.1.2 的接口返回字符串正常,返回 POJO 却缺少 JsonApplyView。检查是否把 Jackson databind 覆盖到 3.2.x,却保留旧 annotations。
Spring Boot 4.1.2 的控制器返回字符串正常,返回 POJO 却报:
java.lang.NoClassDefFoundError: com/fasterxml/jackson/annotation/JsonApplyView
若异常堆栈指向 tools.jackson.databind.introspect.JacksonAnnotationIntrospector.findApplyView,先核对 Jackson 的实际版本。jackson-databind:3.2.2 配上 jackson-annotations:2.21,就不具备该调用需要的类。
Boot 4.1.2 管理的 Jackson databind 是 3.1.7。看到 3.2.2 时,应找出是谁覆盖了依赖管理,而不是直接认定默认 Web starter 无法序列化对象。JsonApplyView 出现在 annotations 2.22 中;这也不表示只加一个 JAR 就构成项目完整的兼容升级。
从解析结果追到版本覆盖
在原 Maven 项目查看完整依赖树:
mvn dependency:tree -Dverbose
这个目标可能下载插件并写本地缓存,应在正常开发环境使用。关注 tools.jackson.core 下的 databind、core,以及 com.fasterxml.jackson.core 下的 annotations。Jackson 3 仍使用这组 annotations 坐标,不能因为 groupId 保留 com.fasterxml 就把它当成误引入 Jackson 2 的证据。
核对父 POM、BOM 导入、版本属性、直接依赖和第三方平台的覆盖。IDE 展示的一条 starter 依赖,不能代替最终解析树;打包后也可能因旧产物残留而装入不同版本。
优先恢复受管理的组合
如果没有明确的 Jackson 3.2 功能需求,移除意外的单独版本覆盖,让相关模块回到当前 Boot BOM 管理的组合。保留其他依赖配置,不要删除整份 dependencyManagement,也不要手工从网络下载一个 annotations JAR 塞入运行目录。
确需升级整个 Jackson 家族时,应核对目标 Jackson 与 Boot 的兼容范围,并通过相应 BOM 或完整的依赖管理方案保持一致。跨版本升级会影响序列化、模块和注解行为,不能把“类能找到”当成全部通过。
重新打包后检查产物中的实际依赖,再请求原来返回 POJO 的接口,验证字段、空值、日期和异常响应。字符串接口成功只能说明它走通了自己的转换路径。保留原依赖锁定与配置差异,回退时恢复配套组合,避免只退一个模块再次留下混配。


