当前位置: 首页 > news >正文

InvalidDefinitionException: Java 8 date/time type `java.time.LocalDateTime` not supported by default

Jackson日期时间配置说明

问题描述

在使用Java 8的LocalDateTimeLocalDateLocalTime等时间类型时,Jackson默认不支持序列化和反序列化,会抛出以下异常:

​​​​​​​InvalidDefinitionException: Java 8 date/time type `java.time

解决方案

已创建JacksonConfig配置类来解决此问题。

配置文件位置

JacksonConfig.java

import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; @Configuration public class JacksonConfig { /** * 日期时间格式 */ private static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; private static final String DATE_PATTERN = "yyyy-MM-dd"; private static final String TIME_PATTERN = "HH:mm:ss"; @Bean @Primary public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = builder.createXmlMapper(false).build(); // 注册JavaTimeModule,支持Java 8时间类型 JavaTimeModule javaTimeModule = new JavaTimeModule(); // LocalDateTime序列化和反序列化 javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_PATTERN))); javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATE_TIME_PATTERN))); // LocalDate序列化和反序列化 javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_PATTERN))); javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DATE_PATTERN))); // LocalTime序列化和反序列化 javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(TIME_PATTERN))); javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(TIME_PATTERN))); objectMapper.registerModule(javaTimeModule); // 配置序列化特性 // 禁用将日期序列化为时间戳 objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // 禁用将日期作为时间戳写入 objectMapper.disable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS); // 配置反序列化特性 // 忽略未知属性 objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); // 允许空对象 objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); return objectMapper; } }

配置内容

  1. 注册JavaTimeModule模块

    • 支持Java 8时间类型的序列化和反序列化
  2. 配置日期时间格式

    • LocalDateTime:yyyy-MM-dd HH:mm:ss
    • LocalDate:yyyy-MM-dd
    • LocalTime:HH:mm:ss
  3. 其他配置

    • 禁用将日期序列化为时间戳
    • 忽略未知属性
    • 允许空对象

使用示例

实体类定义

@Data public class BaseEntity { private Long id; private LocalDateTime createTime; // 自动格式化为 yyyy-MM-dd HH:mm:ss private LocalDateTime updateTime; // 自动格式化为 yyyy-MM-dd HH:mm:ss }

API返回示例

{ "code": 200, "success": true, "data": { "id": 1, "username": "admin", "createTime": "2025-01-15 10:30:00", "updateTime": "2025-01-15 10:30:00" } }

API请求示例

{ "username": "test", "realName": "测试用户", "createTime": "2025-01-15 10:30:00" }

注意事项

  1. 全局配置

    • 所有的LocalDateTimeLocalDateLocalTime字段都会自动应用配置的格式
    • 不需要在每个字段上添加@JsonFormat注解
  2. 自定义格式

    • 如果某个字段需要特殊格式,可以使用@JsonFormat注解覆盖全局配置
    @JsonFormat(pattern = "yyyy/MM/dd") private LocalDate specialDate;
  3. 时区问题

    • 当前配置使用系统默认时区
    • 如需指定时区,可以在@JsonFormat中添加timezone属性
  4. 兼容性

    • 配置已添加到Spring容器中,自动应用于所有HTTP请求和响应
    • 也适用于手动使用ObjectMapper进行序列化和反序列化

相关依赖

<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency>

此依赖已在pom.xml中配置,Spring Boot会自动管理版本。




​​​​​​​

http://www.jsqmd.com/news/248842/

相关文章:

  • 如何使用SpringAI来实现一个RAG应用系统
  • 环保与水务行业PLC设备远程诊断与维护解决方案
  • 储能系统绝缘监测的技术突破:微电流传感器在直流侧的应用与优化
  • 巴菲特的股东回报政策:股息与回购的平衡
  • 2026年网络安全就业前景怎么样?网络安全工程师多少钱一个月?
  • 了解串口通信
  • 快速构建您的小程序+APP+H5商城源码系统,并邀请商户入驻
  • 飞牛 NAS 远程访问卡顿?这份终极配置指南 ,让你的影音库真正“移动”起来
  • AI智能问数系统:让业务人员玩转数据的技术底层
  • VP引导定位软件-平移九点标定
  • VP引导定位软件-平移九点标定
  • leetcode 困难题 871. Minimum Number of Refueling Stops 最低加油次数-内存100
  • 大学生未来想要从事网络安全,不知道先学什么应该从哪开始?(末尾附学习路线图)
  • leetcode 872. Leaf-Similar Trees 叶子相似的树-耗时100
  • C# winform部署yolo26-seg实例分割的onnx模型演示源码+模型+说明
  • 解读GB/T4857.5跌落测试标准 助力医药包装NMPA注册合规
  • 适合PPT汇报的扁平化图片素材哪里找?10个优质网站推荐!
  • 2026精选10个商业海报背景图网站:设计师必藏!
  • 基于MATLAB Simulink R2015b平台的三相感应电机动态仿真建模与性能分析
  • 吐血推荐8个一键生成论文工具,研究生轻松搞定论文写作!
  • 阿德勒《自卑与超越》深度解读:于自卑中寻路,在合作中超越
  • 救命神器9个AI论文网站,专科生毕业论文格式规范+写作神器推荐!
  • 技术领先!优化电商系统源码,系统支持H5、公众号、移动端、平板、各种小程序
  • 电商源码系统集成海量促销功能,引爆销售增长
  • 【48】无人机数据集(有v5/v8模型)/YOLO无人机检测
  • 为什么本应比大多数人更擅长写作的人文学科教授,经常写出不知所云的东西呢?
  • 深度测评!研究生必备10款AI论文软件:开题报告到毕业论文全解析
  • 设计和开发基于大语言模型的AI应用系统
  • Notepad++无捆绑下载+超详细下载安装教程步骤(附加安装包下载)
  • django-flask基于python的大学生兼职系统