SpringBoot基于Jackson解決Long型長度丟失問題
問題背景
JavaScript能處理的數(shù)據(jù)精度有限,長度一旦超過17位就會(huì)發(fā)生長度丟失。因此,id值在被序列化為JSON時(shí)經(jīng)常會(huì)有后幾位與原數(shù)據(jù)匹配不上的問題。
數(shù)據(jù)庫中的數(shù)據(jù)
可以發(fā)現(xiàn)頁面拿到的數(shù)據(jù)的id值和數(shù)據(jù)庫中的id值最后兩位不一致
為了解決該問題,可以將Long型轉(zhuǎn)化為String
可利用jackson的ObjectMapper來實(shí)現(xiàn)
解決方法
ObjectMapper(對象轉(zhuǎn)換器),是jackson中的一個(gè)類,它實(shí)現(xiàn)了java對象到JSON之間的轉(zhuǎn)換(序列化、反序列化)。
當(dāng)ObjectMapper中固有的序列化器(或反序列化器)不能滿足我們的需求時(shí),我們需要自定義一個(gè)對象轉(zhuǎn)換器,即創(chuàng)建 ObjectMapper 的子類,為其添加新的序列化器,例如 (Long --> String) 的序列化器
實(shí)現(xiàn)步驟
1. 自定義對象轉(zhuǎn)換器,添加序列化器(或反序列化器)
2. 將該對象轉(zhuǎn)換器加入到 SpringMVC 的消息轉(zhuǎn)換器隊(duì)列中
自定義的對象轉(zhuǎn)換器即為ObjectMapper的子類,為其添加序列化器
/** * 對象轉(zhuǎn)換器 ObjectMapper:基于jackson將Java對象轉(zhuǎn)為json(序列化),或者將json轉(zhuǎn)為Java對象(反序列化) * * ObjectMapper中固有的序列化器(或反序列化器)可能不能滿足我們的需求 * 因此需要?jiǎng)?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(); //收到未知屬性時(shí)不報(bào)異常 this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false); //反序列化時(shí),屬性不存在的兼容處理 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) // 實(shí)現(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 進(jìn)行注冊 this.registerModule(simpleModule); } }
現(xiàn)在已經(jīng)創(chuàng)建出了自定義的對象轉(zhuǎn)換器,但還無法生效,需要對它進(jìn)行相關(guān)配置
在WebMVC配置類中,重寫extendMessageConverters方法,將自定義的對象轉(zhuǎn)換器加入到消息轉(zhuǎn)換器隊(duì)列中,使其生效
/** * 擴(kuò)展 Spring MVC 的消息轉(zhuǎn)換器 * * 將自定義的對象轉(zhuǎn)換器 JacksonObjectMapper 加入到 SpringMVC 的消息轉(zhuǎn)換器隊(duì)列中 * * @param converters */ @Override protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) { log.info("擴(kuò)展消息轉(zhuǎn)換器......"); MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter(); messageConverter.setObjectMapper(new JacksonObjectMapper()); converters.add(0, messageConverter); }
再次測試結(jié)果如下
可以發(fā)現(xiàn)此時(shí)頁面拿到的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,前端接收進(jìn)度丟失,@JsonSerialize不生效問題
- SpringBoot返回前端Long類型字段丟失精度問題及解決方案
- SpringBoot分頁的實(shí)現(xiàn)與long型id精度丟失問題的解決方案介紹
- springboot?Long?精度丟失問題解決
- SpringBoot2.0解決Long型數(shù)據(jù)轉(zhuǎn)換成json格式時(shí)丟失精度問題
- SpringBoot全局配置long轉(zhuǎn)String丟失精度的問題解決
- SpringBoot全局配置long轉(zhuǎn)String丟失精度問題解決方案
相關(guān)文章
詳解Java編程中線程同步以及定時(shí)啟動(dòng)線程的方法
這篇文章主要介紹了詳解Java編程中線程同步以及定時(shí)啟動(dòng)線程的方法, 講到了wait()與notify()方法以及阻塞隊(duì)列等知識(shí),需要的朋友可以參考下2016-01-01kafka 重新分配partition和調(diào)整replica的數(shù)量實(shí)現(xiàn)
當(dāng)需要提升Kafka集群的性能和負(fù)載均衡時(shí),可通過kafka-reassign-partitions.sh命令手動(dòng)重新分配Partition,增加節(jié)點(diǎn)后,可以將Topic的Partition的Leader節(jié)點(diǎn)均勻分布,以提高寫入和消費(fèi)速度,感興趣的可以了解一下2022-03-03Mybatis Plus 字段為空值時(shí)執(zhí)行更新方法未更新解決方案
這篇文章主要介紹了Mybatis Plus 字段為空值時(shí)執(zhí)行更新方法未更新解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Spring?Cloud?Gateway?服務(wù)網(wǎng)關(guān)的部署與使用詳細(xì)講解
這篇文章主要介紹了Spring?Cloud?Gateway?服務(wù)網(wǎng)關(guān)的部署與使用詳細(xì)介紹,本文給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04JAVA中的函數(shù)式接口Function和BiFunction詳解
這篇文章主要介紹了JAVA中的函數(shù)式接口Function和BiFunction詳解,JDK的函數(shù)式接口都加上了@FunctionalInterface注解進(jìn)行標(biāo)識(shí),但是無論是否加上該注解只要接口中只有一個(gè)抽象方法,都是函數(shù)式接口,需要的朋友可以參考下2024-01-01IDEA中SpringBoot項(xiàng)目的yml多環(huán)境配置方式
這篇文章主要介紹了IDEA中SpringBoot項(xiàng)目的yml多環(huán)境配置,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-10-10