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

Jackson 序列化:Cannot deserialize value of type `java.time.LocalDateTime`

问题描述

使用 jackson 反序列化异常如下:

Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type java.time.LocalDateTime from String “2023-02-13 19:43:01”: Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text ‘2023-02-13 19:43:01’ could not be parsed at index 10
at [Source: (String)“{“code”:0,“message”:“OK”,“request_id”:“20230214155816454DFD3C7EAE510F39CE”,“data”:{“list”:[{“creative_create_time”:“2023-02-13 19:43:01”,“creative_id”:1757715969881150,“creative_modify_time”:“2023-02-13 19:43:02”}],“page_info”:{“page”:1,“page_size”:1,“total_number”:411,“total_page”:411}}}”; line: 1, column: 116] (through reference chain: com.xxx.core.domain.vo.AdResultVO[“data”]->com.xxx.core.domain.vo.AdDataVO[“list”]->java.util.ArrayList[0]->com.xxx.core.domain.vo.AdCreativityDetailsVO[“creative_create_time”])

LocalDateTime 类型的 creative_modify_time 字段反序列化失败,一看到日期字段序列化你可能就头疼了!大概率是 Jackson 配置上的问题。


原因分析:

项目使用 Springboot 技术框架,并使用 Jackson 做序列化工具。

那这里导致问题的原因是因为通常时间序列化成字符串的时候都是 yyyy-MM-dd HH:mm:ss

但是 Jackson 默认的序列化格式是国际化的时间标准格式:yyyy-MM-ddTHH:mm:ss,区别就在于中间多了个 T

我们找找源头,使用了 LocalTimeDeserializer 反序列化器:

在这里插入图片描述

我们继续看看实际的格式:

在这里插入图片描述

综上,对于这种 2023-02-13 19:43:01 字符串想要反序列化成 LocalDateTime 类型,需要我们自定义我们需要的 DateTimeFormatter


解决方案:

在 Spring 体系下,已经对 Jackson 做了很好的一层包装,也预留了口子,让我们能够很轻易的自定义序列化格式。

我们要做的就是在 Jackson2ObjectMapperBuilderCustomizer 中自定义配置,然后将其装配为 Bean,如下:

@Configuration
class LocalDateTimeSerializerConfig {@Value("\${spring.jackson.date-time-format:yyyy-MM-dd HH:mm:ss}")private val datetimepattern: String? = nullfun localDateTimeSerializer(): LocalDateTimeSerializer {return LocalDateTimeSerializer(DateTimeFormatter.ofPattern(datetimepattern))}fun localDateTimeDeserializer():LocalDateTimeDeserializer{return LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(datetimepattern))}@Beanfun jackson2ObjectMapperBuilderCustomizer(): Jackson2ObjectMapperBuilderCustomizer {return Jackson2ObjectMapperBuilderCustomizer { builder: Jackson2ObjectMapperBuilder ->builder.serializerByType(LocalDateTime::class.java, localDateTimeSerializer())builder.deserializerByType(LocalDateTime::class.java,localDateTimeDeserializer())}}}

这样就可以了,后面的配置就是 SpringBoot 自动将配置装配到我们的 ObjectMapper 对象中。

当然,依葫芦画瓢,你还可以自定义 LocalDate、LocalTime … 等自定义序列化配置 …

原理探索:

日期时间:

JSR310 规定了「日期时间」处理的新标准,并在 jdk1.8 的版本中进行了实现,其中你熟悉的 LocalDateTime、LocalDate 等就是 JSR310 标准的实现类。

Jackson 工具在进行「日期时间」序列化/反序列化的时候也采用 jdk1.8 中 JSR310 标准实现来处理。

不过 Jackson 单独罗列一个模块来粘合「Jackson 和 jdk1.8 的 JSR310 实现」,这个模块名就叫做 jackson-datatype-jsr310,你的项目里应该能看到这个包的引入。

Jackson 在全世界范围内流行,Spring 也将其作为默认的序列化框架,来对请求中的参数做 序列化和反序列化 行为。

当然,实际情况下,你应该也经常使用 Jackson, 尤其是 日期时间 类参数有着特殊的序列化需求,大部分工作 Spring 都帮你做了,你只需要添加你的个性化序列化方式即可(参数配置、Bean 实例等)

Jackson:

你应该也猜到了,Spring 这个中间者,会帮你初始化 ObjectMapper 实例,同时还会预留一个口子,方便你自定义配置。

其中关键的类是 Jackson2ObjectMapperBuilder,从名字应该也看出来了,该类专门用于构建 ObjectMapper。

熟悉 SpringBoot 的你应该知道,约定大于配置,所以,我们继续找到 自动装载 Bean 的类:JacksonAutoConfiguration

注意到其中 Jackson2ObjectMapperBuilder 装载的方法:

@Bean
@Scope("prototype")
@ConditionalOnMissingBean
Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder(ApplicationContext applicationContext,List<Jackson2ObjectMapperBuilderCustomizer> customizers) {Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();builder.applicationContext(applicationContext);customize(builder, customizers);return builder;
}

我们再看需要的 参数 List<Jackson2ObjectMapperBuilderCustomizer.>,换句话说,Jackson2ObjectMapperBuilderCustomizer 就是给我们留的口子,我们实现它来达到自定义配置的目的。




相关参考:

  1. JSR310 标准
  2. JSRs: Java Specification Requests/JSR 310: Date and Time API

相关文章:

Jackson 序列化:Cannot deserialize value of type `java.time.LocalDateTime`

问题描述 使用 jackson 反序列化异常如下&#xff1a; Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type java.time.LocalDateTime from String “2023-02-13 19:43:01”: Failed to deserialize java.time.LocalDat…...

机试_3_数据结构(一)_习题

数据结构&#xff08;一&#xff09;——练习题 学习完第三章-数据结构&#xff08;一&#xff09;之后&#xff0c;当然要做相应地练习啦~ 注&#xff1a;上述习题都可以在牛客进行测试。 例如&#xff0c;第2题链接&#xff1a;计算表达式_牛客题霸_牛客网 (nowcoder.com)…...

《Hadoop篇》------HDFS与MapReduce

目录 一、HDFS角色职责总结 二、CheckPoint机制 三、Mapreduce序列化 四、Mapper 4.1、官方介绍 4.2、Split计算 4.3、Split和block对应关系 4.4、启发式算法 五、MapTask整体的流程 六、压缩算法 6.1、压缩算法适用场景 6.2、压缩算法选择 6.2.1、Gzip压缩 6.2…...

网络爬虫简介

前言 没什么可以讲的所以就介绍爬虫吧 介绍 网络爬虫&#xff08;英语&#xff1a;web crawler&#xff09;&#xff0c;也叫网路蜘蛛&#xff08;spider&#xff09;&#xff0c;是一种用来自动浏览万维网的网络机器人。其目的一般为编纂网络索引。 网路搜索引擎等站点通过…...

通过4个月的自动化学习,现在我也拿到了25K的offer

毕业后的5年&#xff0c;是拉开职场差距的关键时期。有人通过这5年的努力&#xff0c;实现了大厂高薪&#xff0c;有人在这5年里得到贵人的赏识&#xff0c;实现了职级的快速拔升&#xff0c;还有人在这5年里逐渐掉队&#xff0c;成了职场里隐身一族&#xff0c;归于静默。 而…...

分库分表了解

数据切分根据其切分类型&#xff0c;可以分为两种方式&#xff1a;垂直&#xff08;纵向&#xff09;切分和水平&#xff08;横向&#xff09;切分一&#xff1a;垂直&#xff08;纵向&#xff09;切分【基于表或字段划分&#xff0c;表结构不同】1&#xff1a;垂直分库根据业务…...

docker中 gitlab 安装、配置和初始化

小笔记&#xff1a;gitlab配置文件 /etc/gitlab/gitlab.rb 配置项jcLee95 的CSDN博客&#xff1a;https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/1…...

有哪些好用的C++Json库?

文章目录RapidJSONJSON for Modern CBoost.PropertyTreeJanssonPicoJSONC REST SDKnlohmann json&#xff08;ky用的这个&#xff09;jsoncpp&#xff08;cw用的这个&#xff09;RapidJSON RapidJSON是一个快速、高效的C JSON解析器和生成器&#xff0c;支持SAX和DOM两种解析模…...

Docker 快速上手学习入门教程

目录 1、docker 的基础概念 2、怎样打包和运行一个应用程序&#xff1f; 3、如何对 docker 中的应用程序进行修改&#xff1f; 4、如何对创建的镜像进行共享&#xff1f; 5、如何使用 volumes 名称对容器中的数据进行存储&#xff1f;// 数据挂载 6、另一种挂载方式&…...

深度学习笔记:误差反向传播(1)

1 计算图 计算图使用图&#xff08;由节点和边构成的图&#xff09;来表达算式。 如图&#xff0c;我们用节点代表运算符号&#xff0c;用边代表传入的参数&#xff0c;即可算出购买苹果和橘子的总价格。 2 计算图的局部计算 局部计算意味着每个节点只处理和其相关的运算&…...

锁相环(1)

PLL代表相位锁定环。顾名思义&#xff0c;如下图所示&#xff0c;PLL是一种具有反馈循环的电路&#xff0c;可将反馈信号的相/频率保持与参考输入信号的相/频率相同&#xff08;锁定&#xff09;。 如下图所示&#xff0c;如果参考输入和反馈输入之间存在相位差&#xff0c;则…...

2023金三银四跳槽必会Java核心知识点笔记整理

现在互联网大环境不好&#xff0c;互联网公司纷纷裁员并缩减 HC&#xff0c;更多程序员去竞争更少的就业岗位&#xff0c;整的 IT 行业越来越卷。身为 Java 程序员的我们就更不用说了&#xff0c;上班 8 小时需要做好本职工作&#xff0c;下班后还要不断提升技能、技术栈&#…...

二十四节气—雨水,好雨知时节,当春乃发生。

雨水&#xff0c;是二十四节气之第2个节气。 雨水节气不仅表明降雨的开始及雨量增多&#xff0c;而且表示气温的升高&#xff0c;意味着进入气象意义的春天。 雨水节是一个非常富有想象力和人情味的节气&#xff0c;在这一天&#xff0c;不管下不下雨都充满着一种雨意蒙蒙的诗…...

为什么要使用数据库?

随着互联网技术的高速发展&#xff0c;预计2020 年底全世界网民的数量将达到 50 亿。网民数量的增加带动了网上购物、微博&#xff0c;网络视频等产业的发展。那么&#xff0c;随之而来的就是庞大的网络数据量。 大量的数据正在不断产生&#xff0c;那么如何安全有效地存储、检…...

【原创】java+swing+mysql图书管理系统设计与实现

图书管理系统是一个比较常见的系统&#xff0c;今天我们主要介绍如何使用javaswiingmysql去开发一个cs架构的图书管理系统&#xff0c;方便学生进行图书借阅。 功能分析&#xff1a; 宿舍报修管理系统的使用角色&#xff0c;一般分为管理员和学生&#xff0c;管理员主要进行学…...

图论 —— 强连通分量

概念 连通图 无向图 G G G 中,若对任意两点 V i , V j V_i, V_j V<...

计算机网络(二):物理层和链路层,通道复用,MAC地址,CSMA/CD协议,PPP点对点协议

文章目录一、物理层主机之间的通信方式通道复用技术常见的宽带接入技术二、链路层MAC地址和IP地址分别有什么作用为什么有了MAC地址之后还需要IP地址为什么有了IP地址还需要MAC地址以太网中的CSMA/CD协议数据链路层上的三个基本问题PPP协议一、物理层 主机之间的通信方式 单工…...

英语基础-定语从句的特殊用法及写作应用

1. 定语从句的引导词省略的情况 1. that 引导定语从句&#xff0c;从句中缺宾语/表语&#xff0c;that可省略&#xff1b; This is the book that he likes. I like the shirt that you gave me. We do not agree on the plan that you make. China is not the country th…...

[数据结构]---八大经典排序算法详解

&#x1f427;作者主页&#xff1a;king&南星 &#x1f3f0;专栏链接&#xff1a;c 文章目录一、八大排序算法复杂度对比二、基于比较的排序算法1.冒泡排序2.选择排序3.插入排序4.希尔排序5.直观感受四种算法的时间复杂度三、基于非比较的排序算法1.基数排序2.箱(桶)排序四…...

Go语言设计与实现 -- 反射

Go的反射有哪些应用&#xff1f; IDE中代码的自动补全对象序列化fmt函数的相关实现ORM框架 什么情况下需要使用反射&#xff1f; 不能明确函数调用哪个接口&#xff0c;需要根据传入的参数在运行时决定。不能明确传入函数的参数类型&#xff0c;需要在运行时处理任意对象。 …...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

ui框架-文件列表展示

ui框架-文件列表展示 介绍 UI框架的文件列表展示组件&#xff0c;可以展示文件夹&#xff0c;支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项&#xff0c;适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...

起重机起升机构的安全装置有哪些?

起重机起升机构的安全装置是保障吊装作业安全的关键部件&#xff0c;主要用于防止超载、失控、断绳等危险情况。以下是常见的安全装置及其功能和原理&#xff1a; 一、超载保护装置&#xff08;核心安全装置&#xff09; 1. 起重量限制器 功能&#xff1a;实时监测起升载荷&a…...

【题解-洛谷】P10480 可达性统计

题目&#xff1a;P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图&#xff0c;分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M&#xff0c;接下来 M M M 行每行两个整数 x , y x,y x,y&#xff0c;表示从 …...