SpringBoot基于Jackson解決Long型長度丟失問題
問題背景
JavaScript能處理的數(shù)據(jù)精度有限,長度一旦超過17位就會發(fā)生長度丟失。因此,id值在被序列化為JSON時經(jīng)常會有后幾位與原數(shù)據(jù)匹配不上的問題。

數(shù)據(jù)庫中的數(shù)據(jù)

可以發(fā)現(xiàn)頁面拿到的數(shù)據(jù)的id值和數(shù)據(jù)庫中的id值最后兩位不一致
為了解決該問題,可以將Long型轉(zhuǎn)化為String
可利用jackson的ObjectMapper來實現(xiàn)
解決方法
ObjectMapper(對象轉(zhuǎn)換器),是jackson中的一個類,它實現(xiàn)了java對象到JSON之間的轉(zhuǎn)換(序列化、反序列化)。
當ObjectMapper中固有的序列化器(或反序列化器)不能滿足我們的需求時,我們需要自定義一個對象轉(zhuǎn)換器,即創(chuàng)建 ObjectMapper 的子類,為其添加新的序列化器,例如 (Long --> String) 的序列化器
實現(xiàn)步驟
1. 自定義對象轉(zhuǎn)換器,添加序列化器(或反序列化器)
2. 將該對象轉(zhuǎn)換器加入到 SpringMVC 的消息轉(zhuǎn)換器隊列中
自定義的對象轉(zhuǎn)換器即為ObjectMapper的子類,為其添加序列化器
/**
* 對象轉(zhuǎn)換器 ObjectMapper:基于jackson將Java對象轉(zhuǎn)為json(序列化),或者將json轉(zhuǎn)為Java對象(反序列化)
*
* ObjectMapper中固有的序列化器(或反序列化器)可能不能滿足我們的需求
* 因此需要創(chuàng)建 ObjectMapper 的子類,自定義新的序列化器,例如 Long --> String 的序列化器
*
*/
public class JacksonObjectMapper extends ObjectMapper {
public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
public JacksonObjectMapper() {
super();
//收到未知屬性時不報異常
this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
//反序列化時,屬性不存在的兼容處理
this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
// SimpleModule對象,添加各種序列化器和反序列化器
SimpleModule simpleModule = new SimpleModule()
// 添加反序列化器
.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)))
// 添加序列化器
.addSerializer(BigInteger.class, ToStringSerializer.instance)
.addSerializer(Long.class, ToStringSerializer.instance) // 實現(xiàn) Long --> String 的序列化器
.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)));
// 對自定義的 simpleModule 進行注冊
this.registerModule(simpleModule);
}
}
現(xiàn)在已經(jīng)創(chuàng)建出了自定義的對象轉(zhuǎn)換器,但還無法生效,需要對它進行相關(guān)配置
在WebMVC配置類中,重寫extendMessageConverters方法,將自定義的對象轉(zhuǎn)換器加入到消息轉(zhuǎn)換器隊列中,使其生效
/**
* 擴展 Spring MVC 的消息轉(zhuǎn)換器
*
* 將自定義的對象轉(zhuǎn)換器 JacksonObjectMapper 加入到 SpringMVC 的消息轉(zhuǎn)換器隊列中
*
* @param converters
*/
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
log.info("擴展消息轉(zhuǎn)換器......");
MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
messageConverter.setObjectMapper(new JacksonObjectMapper());
converters.add(0, messageConverter);
}
再次測試結(jié)果如下

可以發(fā)現(xiàn)此時頁面拿到的id值都已經(jīng)變成了String,而且與數(shù)據(jù)庫中的id值完全一致
如此,便解決了Long型長度丟失問題
到此這篇關(guān)于SpringBoot基于Jackson解決Long型長度丟失問題的文章就介紹到這了,更多相關(guān)SpringBoot Long型長度丟失內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot傳給前端Long類型精度丟失的解決方案
- SpringBoot返回long,前端接收進度丟失,@JsonSerialize不生效問題
- SpringBoot返回前端Long類型字段丟失精度問題及解決方案
- SpringBoot分頁的實現(xiàn)與long型id精度丟失問題的解決方案介紹
- springboot?Long?精度丟失問題解決
- SpringBoot2.0解決Long型數(shù)據(jù)轉(zhuǎn)換成json格式時丟失精度問題
- SpringBoot全局配置long轉(zhuǎn)String丟失精度的問題解決
- SpringBoot全局配置long轉(zhuǎn)String丟失精度問題解決方案
相關(guān)文章
Java多態(tài)概念、實現(xiàn)機制與實踐應用詳解
多態(tài)是指同一個方法在不同對象上具有不同的行為,通過多態(tài)程序可以在運行時決定調(diào)用哪個方法,從而提高代碼的靈活性和可擴展性,這篇文章主要介紹了Java多態(tài)概念、實現(xiàn)機制與實踐應用的相關(guān)資料,需要的朋友可以參考下2026-01-01
Java并發(fā)編程之CountDownLatch的使用
CountDownLatch是一個倒數(shù)的同步器,常用來讓一個線程等待其他N個線程執(zhí)行完成再繼續(xù)向下執(zhí)行,本文主要介紹了CountDownLatch的具體使用方法,感興趣的可以了解一下2023-05-05
如何解決Could not transfer artifact org.spri
在Maven更新過程中遇到“Could not transfer artifact org.springframework.boot”錯誤通常是由于網(wǎng)絡問題,解決方法是在Maven的設置中忽略HTTPS,添加特定語句后,可以正常下載依賴,但下載速度可能較慢,這是一種常見的解決方案,希望對遇到相同問題的人有所幫助2024-09-09

