1. 当Jackson遇上LocalDateTime:一场类型不匹配的"误会"
第一次用Jackson序列化LocalDateTime时,我盯着控制台鲜红的报错信息愣了三秒。明明用同样的方式处理Date对象完全没问题,换成Java 8的LocalDateTime怎么就翻车了呢?相信不少Java开发者都遇到过这个经典场景:
java复制ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(LocalDateTime.now()); // 抛出InvalidDefinitionException
控制台会明确告诉你:"Java 8 date/time type java.time.LocalDateTime not supported by default"。这就像你带着最新款智能手机去修,老师傅却说他只有修理老式诺基亚的工具。问题的本质在于:Jackson默认没有内置对Java 8时间类型的支持,需要额外安装"适配器"。
这里有个有趣的对比实验:用同样的ObjectMapper序列化传统的Date对象却能正常工作,输出的是毫秒时间戳。这种差异化的表现正体现了Jackson团队的设计哲学——保持核心库的轻量,通过模块化扩展支持新特性。当我们在项目中开始使用LocalDateTime这类新API时,就需要引入专门的适配模块。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 三步搞定基础序列化问题
2.1 引入必要的依赖
解决方案就在错误提示里——添加jackson-datatype-jsr310模块。这个命名很有意思:"jsr310"正是Java 8日期时间API的规范编号,就像产品的型号标识。在Maven项目中需要添加以下依赖:
xml复制<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.13.4</version>
</dependency>
这里有个版本匹配的坑我踩过:jackson-datatype-jsr3
