java Long型別轉為json後資料損失精度的處理方式
阿新 • • 發佈:2022-01-15
目錄
- 表結構設計
- AbumTip類
- 根據外來鍵abum_id在資料庫中查詢的結果
- Controller查到的結果
- chrome瀏覽器preview結果
- 解決的方法
- 方法一
- 方法二
- 方法三
最近在專案開發中,使用spring boot+mybatis的架構,資料庫設計主鍵id時定義為bigint型別,使用mybatis的自動生成程式碼後沒注意,主鍵在pojo裡的型別為Long。查詢時獲取的物件列表取出的數值沒有問題,但轉為on傳到前端後,id的資料始終不是資料庫查出來的那個。
資料庫表結構設計
AbumTip類
根據外來鍵abum_id在資料庫中查詢的結果
Controller查到的結果
chrome瀏覽器preview結果
可以看到abumId(對應表abum_id)和tipId(對應表中tip_id)查詢到的Long型別的資料都不對。
解決的方法
方法一
重新生成pojo物件,將所有資料庫型別為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 .util.List; @EnableWebMvc @Configuration public class WebDataConvertConfig extends WebMvcConfigurerAdapter { public void configureMessageConverwww.cppcns.comters(List<HttpMessageConverter<?>> converters) { MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); ObjectMapper objectMapper = new ObjectMapper(); /** * 序列換成json時,將所有的long變成string * 因為js中得數字型別不能包含所有的java long值 */ SimpleModule simpleModrpOFkYAbule = 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為自定義轉換器
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>
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。