Jackson序列化/反序列化Joda DateTime失败问题求助
我来帮你捋一捋这个问题,折腾这么久肯定头疼了吧!核心问题其实出在Jackson依赖版本不匹配上,你遇到的NoSuchFieldError和序列化失败都和这个直接相关。
1. 先修复依赖版本不一致的问题
你当前的Gradle配置里,jackson-datatype-joda用的是2.9.4,但jackson-core是2.9.5——Jackson的所有核心组件(core、databind、datatype-joda等)必须严格保持版本一致,否则会出现类、字段找不到的兼容性问题,比如那个ADJUST_DATES_TO_CONTEXT_TIME_ZONE字段,就是因为版本不匹配才找不到的。
另外,你还漏掉了jackson-databind依赖(ObjectMapper就来自这个包),虽然可能间接引入,但显式声明能避免版本冲突。修正后的Gradle配置应该是这样:
compile 'joda-time:joda-time:2.9.4' compile 'com.fasterxml.jackson.core:jackson-core:2.9.4' compile 'com.fasterxml.jackson.core:jackson-databind:2.9.4' compile 'com.fasterxml.jackson.datatype:jackson-datatype-joda:2.9.4'
如果可以的话,也建议升级到更稳定的Jackson版本(比如2.15.x),只要和joda-time 2.9.4兼容就行,新版本能修复不少老bug。
2. 调整ObjectMapper配置(版本统一后生效)
版本统一后,你之前尝试设置的ADJUST_DATES_TO_CONTEXT_TIME_ZONE就不会报错了。不过要注意,这是反序列化阶段的配置,如果你只是序列化DateTime有问题,其实可以先不用加;如果反序列化时时区有问题,再添加这个配置:
ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new JodaModule()); // 反序列化时区配置(按需添加) mapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);
3. 验证Book类的注解
你的Book类注解(@JsonProperty、@JsonInclude这些)都没问题,只要依赖修复,DateTime的序列化/反序列化应该就能正常工作了。
按照上面的步骤调整后,再运行你的测试代码,应该就能成功把DateTime序列化为JSON,也能反序列化回来啦。如果还有问题,可以仔细看一下控制台的异常栈,看看是不是有其他被掩盖的错误。
内容的提问来源于stack exchange,提问作者Ariel Grabijas

