如何让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
相关产品推荐
相关产品推荐

