java Long類型轉為json後數據損失精度的處理方式
最近在項目開發中,使用spring boot+mybatis的架構,數據庫設計主鍵id時定義為bigint類型,使用mybatis的自動生成代碼後沒註意,主鍵在pojo裡的類型為Long。查詢時獲取的對象列表取出的數值沒有問題,但轉為json傳到前端後,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 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中得數字類型不能包含所有的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為自定義轉換器
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>
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- SpringBoot全局配置long轉String丟失精度的問題解決
- SpringBoot返回對象時,如何將Long類型轉換為String
- SpringBoot雪花算法主鍵ID傳到前端後精度丟失問題的解決
- SpringBoot主鍵ID傳到前端後精度丟失的問題解決
- mybatis-plus IdWorker生成的Id和返回給前臺的不一致的解決