自定義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.pswp.cn/bicheng/79218.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79218.shtml
英文地址,請注明出處:http://en.pswp.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的生…