java?Long類型轉(zhuǎn)為json后數(shù)據(jù)損失精度的處理方式
最近在項目開發(fā)中,使用spring boot+mybatis的架構(gòu),數(shù)據(jù)庫設(shè)計主鍵id時定義為bigint類型,使用mybatis的自動生成代碼后沒注意,主鍵在pojo里的類型為Long。查詢時獲取的對象列表取出的數(shù)值沒有問題,但轉(zhuǎn)為json傳到前端后,id的數(shù)據(jù)始終不是數(shù)據(jù)庫查出來的那個。
數(shù)據(jù)庫表結(jié)構(gòu)設(shè)計
AbumTip類
根據(jù)外鍵abum_id在數(shù)據(jù)庫中查詢的結(jié)果
Controller查到的結(jié)果
chrome瀏覽器preview結(jié)果
可以看到abumId(對應(yīng)表abum_id)和tipId(對應(yīng)表中tip_id)查詢到的Long類型的數(shù)據(jù)都不對。
解決的方法
方法一
重新生成pojo對象,將所有數(shù)據(jù)庫類型為bigint都映射成String類型。
方法二
對于使用springboot,則增加配置代碼:
package com.gj.app.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import java.util.List; @EnableWebMvc @Configuration public class WebDataConvertConfig extends WebMvcConfigurerAdapter { public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); ObjectMapper objectMapper = new ObjectMapper(); /** * 序列換成json時,將所有的long變成string * 因為js中得數(shù)字類型不能包含所有的java long值 */ SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(Long.class, ToStringSerializer.instance); simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); objectMapper.registerModule(simpleModule); jackson2HttpMessageConverter.setObjectMapper(objectMapper); converters.add(jackson2HttpMessageConverter); } }
方法三
在spring MVC中
增加類:
其中LongToStringJsonConverter為自定義轉(zhuǎn)換器
public class LongToStringJsonConverter extends ObjectMapper { /** * */ private static final long serialVersionUID = 1683531771040674386L; @Override public ObjectMapper registerModule(Module module) { SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(Long.class, ToStringSerializer.instance); simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); return super.registerModule(simpleModule); } }
<mvc:annotation-driven conversion-service="conversionService"> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <!-- <bean class="com.fasterxml.jackson.databind.ObjectMapper"> --> <bean class="mypackage.LongToStringAdapter"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" /> </bean> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springBoot項目配置文件加載優(yōu)先級及同配置覆蓋問題詳解
SpringBoot配置?件可以放置在多種路徑下,不同路徑下的配置優(yōu)先級有所不同,下面這篇文章主要給大家介紹了關(guān)于springBoot項目配置文件加載優(yōu)先級及同配置覆蓋問題的相關(guān)資料,需要的朋友可以參考下2023-05-05java學生成績管理系統(tǒng)設(shè)計與實現(xiàn)
這篇文章主要介紹了java學生成績管理系統(tǒng)設(shè)計與實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01SpringBoot如何整合redis實現(xiàn)過期key監(jiān)聽事件
這篇文章主要介紹了SpringBoot如何整合redis實現(xiàn)過期key監(jiān)聽事件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09SpringBoot框架集成token實現(xiàn)登錄校驗功能
這篇文章主要為大家詳細介紹了SpringBoot框架集成token實現(xiàn)登錄校驗功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08springboot使用@KafkaListener監(jiān)聽多個kafka配置實現(xiàn)
當服務(wù)中需要監(jiān)聽多個kafka時,?需要配置多個kafka,本文主要介紹了springboot使用@KafkaListener監(jiān)聽多個kafka配置實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-04-04