自定义JackSon配置

避免前端(JavaScript)处理大数(如 Long、BigInteger)时发生精度丢失问题,所以引入了自定义 Jackson 配置。

先看代码:

 /** 根据id修改员工信息*/@PutMappingpublic R<String> update(HttpServletRequest request,@RequestBody Employee employee){log.info(employee.toString());Long empId = (Long)request.getSession().getAttribute("employee");employee.setUpdateTime(LocalDateTime.now());employee.setUpdateUser(empId);employeeService.updateById(employee);return R.success("员工信息修改成功");}

这里由于要修改的员工信息的id是通过mp雪花算法得到的超长数字,js前端在访问这个数据的时候会出现精度损失,导致后端拿不到这个id,因此无法更新数据

1. jackson 是什么?

Jackson 是一个功能强大的 Java 类库,主要用于在 Java 对象 和 JSON 数据之间做转换。
它可以:

把 Java 对象 转成 JSON 字符串(序列化)

把 JSON 字符串 解析成 Java 对象(反序列化)

你可以把 Jackson 理解为 Java 世界里的 “JSON翻译器”。

官网地址:https://github.com/FasterXML/jackson

在 Java 里常用的 JSON 处理库有:

Jackson (最流行)

Gson (Google出的,也挺常见)

Fastjson (阿里出的,国内有些公司用)

其中 Jackson 在 Spring Boot 里默认就是集成的(不用特地引)。
这里我们用json来处理

2. jackson 和 json 是什么关系?

JSON(JavaScript Object Notation) 是一种数据交换格式,本身跟 Jackson 没有直接关系。

Jackson 是处理 JSON 的工具,是帮你在 Java 中读写 JSON 的 实现库。

换句话说,JSON 是标准,Jackson 是工具。
就像:“水(JSON)是资源,桶(Jackson)是工具”,你用 Jackson 来搬运、转换 JSON 数据。

为什么要特别处理 Long / BigInteger?

这个非常关键!

原因是 JavaScript 的 number 类型(双精度浮点数)在 2^53(大约 16位整数)之后就会失真。
在前端(特别是Vue、React)里,如果后端直接返回数字格式的 Long 或 BigInteger,前端 JSON.parse() 后就精度丢了!

所以你要在后端 把这些大整数转成字符串输出,前端才能安全处理,比如:

{"orderId": "9223372036854775807"
}

前端拿到字符串后,自己解析或展示,不会丢精度!
因此我们要创建自定义模块来注册,序列化器,反序列化器

自定义Jackson ObjectMapper

SimpleModule simpleModule = new SimpleModule()
序列化器

这个是反序列化器(json->java对象):

.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))

这里针对 Java 8 时间类型(LocalDateTime、LocalDate、LocalTime)指定了解析格式。

例如,遇到 “2025-04-28 12:00:00” 这样的字符串时,能正确反序列化成 LocalDateTime。

反序列化器

接着这里用反序列化器(java对象->json):

.addSerializer(BigInteger.class, ToStringSerializer.instance)
.addSerializer(Long.class, ToStringSerializer.instance)
.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));

将 BigInteger 和 Long 类型序列化为字符串(防止前端 JavaScript 解析大整数丢失精度问题)。

将 LocalDateTime、LocalDate、LocalTime 使用指定格式序列化成字符串。

jackson整体关系类图

处理
继承
«interface»
JSON
+数据格式标准
ObjectMapper
+writeValueAsString(Object) : String
+readValue(String, Class) : T
JacksonObjectMapper
+DEFAULT_DATE_FORMAT : String
+DEFAULT_DATE_TIME_FORMAT : String
+DEFAULT_TIME_FORMAT : String
+JacksonObjectMapper()

jacksonObjectMapper结构图

注册模块
添加
添加
添加
添加
添加
添加
添加
JacksonObjectMapper
+DEFAULT_DATE_FORMAT : String
+DEFAULT_DATE_TIME_FORMAT : String
+DEFAULT_TIME_FORMAT : String
+JacksonObjectMapper()
+configure(FAIL_ON_UNKNOWN_PROPERTIES, false)
+registerModule(SimpleModule)
SimpleModule
+addDeserializer(Type, Deserializer)
+addSerializer(Type, Serializer)
LocalDateTimeDeserializer
LocalDateDeserializer
LocalTimeDeserializer
LocalDateTimeSerializer
LocalDateSerializer
LocalTimeSerializer
ToStringSerializer

扩展mvc架构的消息转换器

前面知识配置了jackson的信息,但是还没有完成实现,由于后端发给前端的信息的json格式的,而包装发送json数据是mvc设置的,所以我们还需要在mvc配置类中加入扩展mvc架构信息转换器
具体代码如下:

/** 扩展mvc框架的消息转换器* */@Overrideprotected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {//创建消息转换器对象MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();//设置对象转换器,底层使用jackson将java转成jsonmessageConverter.setObjectMapper(new JacksonObjectMapper());//将上面的消息转换器对象追加到mvc框架的转换器集合中converters.add(0,messageConverter);}

但是这里由于我们扩展了 SpringMVC 配置,导致 Spring Boot 自动配置失效了。 我们继承了一个 MVC 配置类,打破了默认的静态资源映射规则,在 Spring Boot 中(比如用 spring-boot-starter-web):
默认情况下,Spring Boot 自动帮你配置好静态资源访问路径,比如:
/static/

/public/

/resources/

/META-INF/resources/
只要把 HTML、CSS、JS 放在 static 里,可以直接通过 URL 访问,无需自己写 addResourceHandlers()。但是!! 一旦手动继承了 SpringMVC 配置,即使你只是重写 extendMessageConverters(),Spring Boot会认为你要接管整个SpringMVC配置!
于是,Spring Boot默认的静态资源映射失效了。
重写静态资源映射就可以了:

/** 设置静态资源映射*/@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {log.info("开始进行静态资源映射...");registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/static/backend/");registry.addResourceHandler("/front/**").addResourceLocations("classpath:/static/front/");}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/79218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt入门——什么是Qt?

Qt背景介绍 什么是Qt? Qt 是⼀个 跨平台的 C 图形用户界面应用程序框架 。它为应用程序开发者提供了建立艺术级图形界面所需的所有功能。它是 完全面向对象 的&#xff0c;很容易扩展。Qt 为开发者提供了 ⼀种基于组件的开发模式 &#xff0c;开发者可以通过简单的拖拽和组合…

Linux CentOS 安装Python 3.8.0

在 CentOS 上升级 Python 3.6.8 到 3.8.0&#xff0c;可以按照以下步骤操作&#xff1a; 1. 安装依赖 sudo yum groupinstall -y "Development Tools" sudo yum install -y openssl-devel bzip2-devel libffi-devel zlib-devel wget 如果遇到报错“File "/bin…

Python爬虫(11)Python数据存储实战:深入解析NoSQL数据库的核心应用与实战

目录 引言一、背景&#xff1a;为什么选择NoSQL存储爬虫数据&#xff1f;1.1 爬虫数据的核心挑战1.2 NoSQL数据库的核心优势 二、NoSQL数据库在爬虫中的核心应用2.1 MongoDB&#xff1a;文档型数据库的王者2.2 Redis&#xff1a;内存数据库的极致性能 三、NoSQL选型与性能优化策…

PCB设计工艺规范(一)概述

PCB设计工艺规范&#xff08;一&#xff09; 1.概述2.关键词及引用标准3.PCB板材要求3.1 确定PCB使用板材以及TG值3.2 确定 PCB 的表面处理镀层 4.热设计要求5.器件库选项要求 资料来自网络&#xff0c;仅供学习使用。 1.概述 规范产品的 PCB 工艺设计&#xff0c;规定 PCB 工…

proxychains4系统代理for linux(加速国内github下载速度,pip安装)

1.proxychains4代理安装&#xff1a; sudo apt-get install proxychains42.找到配置文件/etc/proxychains4.conf在[ProxyList]后面添加以下内容&#xff1a; socks5 127.0.0.1 10808 配置如下&#xff1a; 3.使用proxychains4(git clone)&#xff1a; proxychains4 git c…

Seata客户端@GlobalTransactional核心源码解析

文章目录 前言一、GlobalTransactional1.1、wrapIfNecessary1.2、handleGlobalTransaction1.3、invoke 二、总结 前言 Seata是阿里开源的分布式事务解决方案。在Spring传统的事务中&#xff0c;开启事务&#xff0c;执行事务&#xff0c;回滚/提交事务&#xff0c;统一由Spring…

pytorch搭建并训练神经网络

#从小白开始学习人工智能# #学习笔记# 工具&#xff1a;pytorch 一、基础概念 1.神经网络是什么&#xff1f; 神经网络是人类受到生物神经细胞结构启发而研究出的算法体系。又称为人工神经网络&#xff08;Artificial neural network&#xff09; 最简版神经网络结构图&a…

JavaEE-多线程实战01

Java 多线程入门&#xff1a;第一个多线程程序 在 Java 中&#xff0c;多线程编程是非常重要的一部分。本篇文章将通过示例&#xff0c;带你快速了解如何创建第一个多线程程序&#xff0c;并深入分析其运行机制。 1. 创建一个线程类并继承 Thread 在 Java 中&#xff0c;我们…

Android Compose 无网络状态处理全指南:从基础到高级实践

Android Compose 无网络状态界面处理全方案 引言 在移动应用开发中&#xff0c;网络连接不稳定是常见场景。优雅地处理无网络状态能显著提升用户体验。Jetpack Compose 提供了强大的工具来实现各种网络状态下的界面展示。本文将全面介绍在 Compose 中处理无网络状态的多种方案…

Arduino项目实战与编程技术详解

一、智能避障小车:超声波传感器与PWM电机控制 1.1 硬件需求与工作原理 智能避障小车的核心在于超声波传感器与电机驱动模块的协同工作。超声波传感器(HC-SR04)通过发射高频声波并接收回波来测量距离,而L298N电机驱动模块则负责控制两个直流电机的转向与速度。 1.1.1 超声…

Java在云计算、大数据、云原生下的应用和优势 - 面试实战

Java在云计算、大数据、云原生下的应用和优势 - 面试实战 第一轮提问 面试官&#xff1a;马架构&#xff0c;请简单介绍一下Java在云计算中的主要应用场景有哪些&#xff1f; 马架构&#xff1a;Java在云计算中的主要应用场景包括微服务架构设计、容器化部署&#xff08;如D…

数据库与大数据技术教程资料

概述 无论你是刚入门的技术新人&#xff0c;还是寻求突破的资深工程师&#xff0c;这份精心整理的电子书合辑将为你打开系统性学习的大门&#xff01;所有资源支持多端阅读&#xff0c;助力技术成长每一步资料已经整理好&#xff0c;喜欢的朋友请自取&#xff1a;https://pan.…

【Spring Boot 注解】@ConfigurationProperties

文章目录 ConfigurationProperties注解一、简介二、依赖引入三、基本用法四、主要特性五、激活方式六&#xff0c;优点七、与 Value 对比 ConfigurationProperties注解 一、简介 ConfigurationProperties 是 Spring Boot 提供的一个强大注解&#xff0c;用于将外部配置&#…

C++(初阶)(十六)——set

set setset介绍set的构造和迭代器set的增删查findlower_boundmultiset和set的差异 题目[349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09;](https://leetcode.cn/problems/intersection-of-two-arrays/description/)交集差集[142. 环形链表 II - 力扣&#xff08;L…

higress之:让流量通过gateway

本来想测跨域问题&#xff0c;结果参数配置过去之后一直没生效&#xff0c;经过了解说是gateway才是设置跨域参数的核心&#xff0c;所以需要让流量通过gateway&#xff0c;捣鼓了半天记录一下 第一步&#xff0c;测试服务是否正常 通过get svc、pod等&#xff0c;发现各pod都…

C盘哪些文件删除之后无影响,可以清理磁盘空间。

C盘是电脑的系统盘,存放了操作系统的重要文件和部分默认安装的软件。当C盘空间不足时,系统可能运行缓慢甚至卡顿,这时清理C盘是一个有效的解决方法。由于C盘包含许多关键数据,清理时需要格外谨慎,以免误删导致系统崩溃。将详细介绍C盘中可以安全删除的文件类型及清理方法,…

开源项目实战学习之YOLO11:ultralytics-cfg-models-fastsam(九)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 1. __init__.py2. model.py3. predict.py4. utils.py5. val.py FastSAM 是一种目标检测和图像分割模型&#xff0c;Ultralytics 是一个在计算机视觉领域广泛使用的库&#x…

Windows11安装Docker

本次安装环境 Windows11&#xff08;23H2&#xff09;&#xff0c;CPU&#xff08;12代Intel&#xff09; 什么是Docker Docker 是一个软件平台&#xff0c;让您可以快速构建、测试和部署应用程序。Docker 将软件打包成名为容器的标准化单元&#xff0c;这些单元具有运行软件所…

C# 在VS2022中开发常用设置

一、基础环境配置 1. 安装必要组件 在 VS2022 安装时确保勾选以下工作负载&#xff1a; ​​使用 .NET 的桌面开发​​&#xff08;包含 WPF/WinForms&#xff09;​​ASP.NET 和 Web 开发​​​​.NET 跨平台开发​​​​Azure 开发​​​​数据存储和处理​​ 2. 主题与外…

k8s的volume

一、volume介绍 volume是Pod中能够呗多个容器访问的共享目录。Kubernetes的Volume概念、用途和目的与Docker的Volume比较类似,但两者不能等价。首先,Kubernetes中的Volume定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下;其次,Kubernetes中的Volume与Pod的生…