Jackson 2.9.7无法解析ISO_INSTANT格式字符串问题求助
解决Jackson 2.9.7无法解析ISO_INSTANT格式字符串的问题
这个问题我之前也碰到过,根源其实是Jackson核心包本身并不包含Java 8日期时间类型(比如Instant)的序列化/反序列化支持,得依赖专门的模块才行。你虽然调用了findAndRegisterModules(),但如果对应的模块不在类路径里,Jackson找不到适配的解析器,就会用默认逻辑去处理字符串,自然就抛出异常了。
具体解决方案:
第一步:添加匹配版本的JSR310模块依赖
Jackson对Java 8时间类型的支持在jackson-datatype-jsr310模块中,而且版本必须和你用的Jackson核心包(2.9.7)完全一致,否则会出现兼容性问题。- 如果用Maven,在
pom.xml里添加:<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>2.9.7</version> </dependency> - 如果用Gradle,在
build.gradle里添加:implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.7'
- 如果用Maven,在
第二步:确保模块正确注册
你原本调用的findAndRegisterModules()会自动扫描类路径中的Jackson模块并注册,只要上面的依赖正确添加,这一步其实已经能生效。不过如果想更稳妥,也可以显式注册模块:ObjectMapper mapper = new ObjectMapper(); // 显式注册JavaTime模块 mapper.registerModule(new JavaTimeModule()); Instant instant = mapper.readValue("2011-12-03T10:15:30Z", Instant.class);
补充说明:为什么时间戳能正常解析?
Jackson默认对数字类型的处理逻辑支持直接将时间戳(毫秒或秒级)转换为Instant,不需要额外模块。但字符串格式的ISO_INSTANT属于特定的日期时间格式,必须依赖JSR310模块提供的解析器才能正确处理。
内容的提问来源于stack exchange,提问作者Vlad Trotsenko
相关产品推荐
相关产品推荐

