[AIGC] 自定義Spring Boot中BigDecimal的序列化方式

在很多場景下,我們需要對BigDecimal類型的數據進行特殊處理,比如保留三位小數。Spring Boot使用Jackson作為默認的JSON序列化工具,我們可以通過自定義Jackson的序列化器(Serializer)來實現,下面將詳細介紹實現步驟。


文章目錄

    • 1. 創建一個自定義序列化類
    • 2. 在需要的字段上使用注解
    • 3. 測試
    • 全局生效的配置方式

1. 創建一個自定義序列化類

首先,我們需要創建一個自定義序列化器類,這個類需要繼承com.fasterxml.jackson.databind.JsonSerializer<T>這個類,并重寫serialize方法。

這個方法的作用就是告訴Jackson如何將Java對象轉換為JSON。

創建一個類,我們可以將其命名為CustomBigDecimalSerialize, 修改如下:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.math.BigDecimal;public class CustomBigDecimalSerializer extends JsonSerializer<BigDecimal> {@Overridepublic void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException {if (value != null) {// 將BigDecimal保留3位小數,注意需要四舍五入BigDecimal decimal = value.setScale(3, BigDecimal.ROUND_HALF_UP);gen.writeNumber(decimal);}}
}

上述代碼中,gen.writeNumber(decimal)就是將處理后的數據寫入JSON中。

2. 在需要的字段上使用注解

我們需要在對應的BigDecimal字段上使用@JsonIgnore注解,來告訴Jackson使用這個新的序列化器,代碼如下:

import com.fasterxml.jackson.databind.annotation.JsonSerialize;public class ExampleEntity {@JsonSerialize(using = CustomBigDecimalSerializer.class)private BigDecimal number;// getters and setters...
}

這樣一來,每當Jackson試圖將這個類實例化為JSON時,它就會使用我們剛剛創建的CustomBigDecimalSerializer進行處理。

3. 測試

我們可以通過一個簡單的Controller來進行測試:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;@RestController
@RequestMapping("/api")
public class TestController {@GetMapping("/test")public ExampleEntity test() {ExampleEntity exampleEntity = new ExampleEntity();exampleEntity.setNumber(new BigDecimal("123.45678"));return exampleEntity;}
}

運行項目,訪問"http://localhost:8080/api/test",可以看見返回的json串中BigDecimal類型的number字段已經被處理為保留3位小數的格式。

以上就是自定義Spring Boot中BigDecimal的序列化方式的完整過程,通過自定義的序列化器,我們可以靈活地控制序列化的過程,滿足各種各樣的需求。


全局生效的配置方式

確實,您可以通過自定義Jackson ObjectMapperModule,將此序列化器全局應用到所有的BigDecimal字段。

以下是實現步驟:

  1. 創建一個配置類
@Configuration
public class JacksonConfig {
}
  1. 在配置類中,定義并配置一個ObjectMapper Bean:
@Bean
public ObjectMapper objectMapper(){ObjectMapper mapper = new ObjectMapper();SimpleModule module = new SimpleModule();module.addSerializer(BigDecimal.class, new CustomBigDecimalSerializer());mapper.registerModule(module);return mapper;
}

SimpleModule是Jackson中的一個功能,它可以讓我們將自定義的序列化器加入到ObjectMapper中。如上,我們創建了一個新的SimpleModule,然后通過 addSerializer 方法添加了我們自定義的BigDecimal序列化器,最后將這個模塊注冊到ObjectMapper中。

這樣,Jackson在序列化BigDecimal字段時,將全局使用我們自定義的序列化器。

需要注意的是,@Bean注解的ObjectMapper將覆蓋Spring Boot的默認ObjectMapper,這意味著所有Jackson的自動配置都將失效,您需要自行配置,或者使用Jackson2ObjectMapperBuilder來保留Spring Boot的自動配置:

@Bean
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder){ObjectMapper mapper = builder.createXmlMapper(false).build();SimpleModule module = new SimpleModule();module.addSerializer(BigDecimal.class, new CustomBigDecimalSerializer());mapper.registerModule(module);return mapper;
}

以上,就是如何將自定義的BigDecimal序列化器全局配置到Spring Boot項目中的所有BigDecimal字段。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22441.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22441.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22441.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣2730.找到最長的半重復子字符串

力扣2730.找到最長的半重復子字符串 找到相鄰的相同字母后same 再雙指針找到前一組相同字母位置 class Solution {public:int longestSemiRepetitiveSubstring(string s) {int res1,n s.size(),same0;for(int i1,j0;i<n;i){if(s[i] s[i-1] && same > 1)for…

godot的安裝和使用 1

今天是第一節&#xff0c;因此呢先做godot的安裝&#xff0c;其實很簡單 godot官網&#xff1a;https://godotengine.org/ 進入官網&#xff0c; 安裝好之后呢&#xff0c;會有兩個文件 打開第一個就是可視化界面的&#xff0c;進入后是這個樣子 說明安裝成功了

【ArcGIS微課1000例】0115:字段數據類型案例詳解

文章目錄 一、ArcGIS數據類型概述二、案例1. 數字2. 文本3. 日期4. BLOB5. 對象標識符6. 全局標識符一、ArcGIS數據類型概述 創建要素類和表時,需要為各字段選擇數據類型。可用的類型包括多種數字類型、文本類型、日期類型、二進制大對象 (BLOB) 或全局唯一標識符 (GUID)。選…

python高級面試題

1. Python 中的 GIL (Global Interpreter Lock) 是什么? 解答: Python 的 GIL 是全局解釋器鎖,限制了在 CPython 解釋器中同時執行多個線程。GIL 確保在任意時刻只有一個線程執行 Python 字節碼。這是為了保護訪問 Python 對象的內部數據結構免受并發問題的影響。盡管 GIL 會…

鴻蒙開發接口安全:【@ohos.abilityAccessCtrl (訪問控制管理)】

訪問控制管理 說明&#xff1a; 本模塊首批接口從API version 8開始支持。后續版本的新增接口&#xff0c;采用上角標單獨標記接口的起始版本。 導入模塊 import abilityAccessCtrl from ohos.abilityAccessCtrlabilityAccessCtrl.createAtManager createAtManager(): AtMan…

LeeCode 1787 DP

題意 傳送門 LeeCode 1787 使所有區間的異或結果為零 題解 任一個元素都至多對 k k k個長度為 k k k的區間產生影響&#xff0c;故難以直接依次處理每一個元素。 觀察到滿足條件的數組中模 k k k意義下索引相等的各個元素相同&#xff0c;故可以依次處理每一個同余類。 d p…

OpenCV學習(4.1) 改變顏色空間

1.目標 在本教程中&#xff0c;你將學習如何將圖像從一個色彩空間轉換到另一個&#xff0c;像BGR?灰色&#xff0c;BGR?HSV等除此之外&#xff0c;我們還將創建一個應用程序&#xff0c;以提取視頻中的彩色對象你將學習以下功能&#xff1a;cv2.cvtColor&#xff0c;**cv2.i…

更適合工程師和研究僧的FPGA專項培訓課程

各位編程精英er~ 社區打造的FPGA工程師培訓班上線后&#xff0c;有不少同學后臺私信詢問&#xff1a;“能不能出個那種專門針對某個知識點的課程呢&#xff1f;我想針對自己的薄弱點深入學習。” 貼心如我&#xff0c;當然會滿足大家的學習需求啦。本周&#xff0c;社區FPGA專…

數學學習基本理念與方法

公理&#xff1a;不證自明的命題&#xff0c;一定條件下都認同的正確的結論 定理&#xff1a;在公理基礎上由嚴謹的數學邏輯獲得&#xff08;為證明的&#xff0c;叫猜想&#xff09; 推論&#xff1a;由某個定理推導出來&#xff0c;相對定理約束條件更多&#xff0c;重要程度…

面試題:說說你對 JS 中 this 指向的了解

面試題&#xff1a;說說你對 JS 中 this 指向的了解 JS 的代碼執行環境分為嚴格模式和非嚴格模式&#xff0c;可以通過 use strict 打開嚴格模式&#xff0c;此時 JS 在語法檢查上會更加嚴格。要討論 JS 中的 this 指向問題&#xff0c;也要分為嚴格模式和非嚴格模式進行討論。…

VRRP簡介

一、VRRP 定義概念 VRRP “Virtual Router Redundancy Protocol”即虛擬路由器冗余協議。 一種將多個物理路由器組合成一個虛擬路由器的協議。為了提供網關的冗余備份&#xff0c;提高網絡的可靠性。虛擬路由器擁有虛擬 IP 地址和虛擬 MAC 地址。虛擬信息作為終端設備訪問網絡…

Nextjs使用教程

一.手動創建項目 建議看這個中文網站文檔,這個里面的案例配置都是手動的,也可以往下看我這個博客一步步操作 1.在目錄下執行下面命令,初始化package.json文件 npm init -y2.安裝react相關包以及next包 yarn add next react react-dom // 或者 npm install --save next react…

使用Python操作Redis

大家好&#xff0c;在當今的互聯網時代&#xff0c;隨著數據量和用戶量的爆發式增長&#xff0c;對于數據存儲和處理的需求也日益增加。Redis作為一種高性能的鍵值存儲數據庫&#xff0c;以其快速的讀寫速度、豐富的數據結構支持和靈活的應用場景而備受青睞。本文將介紹Redis數…

貓頭虎分享已解決Bug || Error: ‘fetch‘ is not defined

原創作者&#xff1a; 貓頭虎 作者微信號&#xff1a; Libin9iOak 作者公眾號&#xff1a; 貓頭虎技術團隊 更新日期&#xff1a; 2024年6月6日 博主貓頭虎的技術世界 &#x1f31f; 歡迎來到貓頭虎的博客 — 探索技術的無限可能&#xff01; 專欄鏈接&#xff1a; &…

獨立游戲之路 -- 上架TapTap步驟和注意事項

個人開發者游戲上架TapTap上架步驟和注意事項 一、TapTap 介紹二、獨立游戲上架 TapTap 的步驟2.1 創建游戲2.2 提交游戲審核2.3 TapTap 平臺上發布。 三、注意事項3.1 關于備案3.2 遵守 TapTap 的規定3.3 保證游戲質量 四、常見問題4.1 隱私政策問題4.2 先發布還是先優化&…

C語言學習--鏈式結構

結構體的應用&#xff1a; //數據結構與算法 數據結構 ---- 指的是 數據的組織形式 數組 --- 數據結構 數組特點 連續性&#xff0c;有序性&#xff0c;單一性 數據操作&#xff08;訪問&#xff09;時的特點 -------------------…

Ubuntu24.04記錄網易郵箱大師的安裝

郵箱大師下載 官網自行下載&#xff0c;下載后文件名“mail.deb" https://dashi.163.com/ 安裝發現缺少依賴 #mermaid-svg-8wqpqFSBVOPD7NGP {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8wqpqFSBVOPD7NGP …

PIVOT函數-動態列

一、需求說明 原始表&#xff1a; select * from pathogen_pro; 將pm_name的值轉成對應的列&#xff0c;效果如下 二、PIVOT函數說明 PIVOT(<聚合函數>([聚合列值]) FOR [行轉列前的列名] IN([行轉列后的列名1],[行轉列后的列名2],[行轉列后的列名3],.......[行轉列后…

Julia編程11:變量作用域 Scope of Variables

There are two main types of scopes in Julia, global* scope* and local* scope*. Julia有全局變量作用域和局部變量作用域&#xff0c;函數或者一些結構體、循環體如for等是否內部是局部環境可以參照下表。 ConstructScope typeAllowed withinmodule, baremoduleglobalglo…

.Net 基于.Net8開發的一個Asp.Net Core Webapi后端框架

1.項目結構 該項目是基于.net8開發的Asp.Net Core WebApi后端服務,集成了Efcore,Autofac,Jwt,AutoMapper,Serilog,Quartz,MiniExcel等組件。該框架簡單易上手&#xff0c;沒有額外的學習成本; 該項目采用了多層結構設計&#xff0c;有利于解耦&#xff0c;包含公共層&#xff0…