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

如何让Jackson JsonTypeInfo使用相对路径?MINIMAL_CLASS异常排查

问题分析与解决:Jackson MINIMAL_CLASS 跨包子类序列化/反序列化异常

首先可以明确:你的预期完全符合Jackson文档描述,这个问题并不是你配置错误,而是Jackson 2.9.x版本中MINIMAL_CLASS类型ID处理的一个已知缺陷。

问题根源

在Jackson 2.9.x中,MINIMAL_CLASS的实现逻辑存在不足:当子类与基类不在同一个包下时,序列化生成的类型ID只取了子类的简单类名(比如.Car),而没有按照文档要求生成相对于基类包的路径(.stuff.Car)。

反序列化时,Jackson会尝试用基类的包名(foo.jackson)加上类型ID中的类名(Car)去查找类,也就是foo.jackson.Car,但你的实际子类在foo.jackson.stuff.Car,自然会抛出类找不到的异常。

解决办法

1. 升级Jackson版本(推荐)

这个问题在Jackson 2.10及以上版本已经被修复。升级到2.10.0或更高版本后:

  • 序列化Car实例会生成符合预期的JSON:{".stuff.Car":{"example":"_example","make":"Duesenberg"}}
  • 反序列化时Jackson能正确识别相对路径,找到foo.jackson.stuff.Car类,不会再报错。

2. 退而使用JsonTypeInfo.Id.CLASS(兼容老版本)

如果因为项目限制无法升级Jackson版本,那么确实只能使用CLASS模式。虽然它生成的类型ID是完整类名(比如foo.jackson.stuff.Car),JSON体积会稍大,但胜在兼容性强,不会出现跨包子类的识别问题,就像你测试的那样,序列化和反序列化都能正常工作。

总结

  • 你的理解完全正确,MINIMAL_CLASS的预期行为确实应该生成相对包路径的类型ID;
  • 问题出在Jackson 2.9.x的实现缺陷,升级版本即可解决;
  • 若无法升级,使用CLASS是最稳妥的替代方案。

内容的提问来源于stack exchange,提问作者Dwight Shih

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:34:23