背景
項目中采用springcloud Alibaba技術(shù)開發(fā)分布式系統(tǒng),開發(fā)過程中采用雪花算法生成分布式Id,為Long類型,而Long類型返回給前端,會出現(xiàn)精度丟失問題。
接下來我們主要了解下,如何快速的處理精度丟失的問題
處理方法
第一種:實體Long類型屬性上注解
可以直接在返回實體屬性添加"@JsonSerialize(using = ToStringSerializer.class)"。
# 舉個例子:比如說我們返回一個Student實體。
@Data
public class Student {
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
private String name;
private Integer sex;
}
這種方式缺點比較明顯,分布式系統(tǒng),幾乎所有的id都為Long類型,我們都需要在id添加注解。而且當(dāng)返回id集合時,這種方式并不適用。博主就是遇到這樣的問題,才考慮了采用下面的方法。我們來詳細(xì)下講解下面的方法。
第二種:全局配置
通過@Configuration聲明配置類,編寫下面這段代碼
package com.ruoyi.common.core.web.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.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JacksonConfig {
/**
* 解決主鍵Long類型返回給頁面時,頁面精度丟失的問題,時間格式化返回
*/
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance)
.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
return objectMapper;
}
}
這樣配置后,工程會將所有的Long類型,都轉(zhuǎn)換為String類型返回給前端。新的問題來了,部分Long類型的屬性,前端不需要轉(zhuǎn)換,比如分頁器的total等,我們怎么辦呢?繼續(xù)往下看:
指定部分Long類型屬性在返回前端不轉(zhuǎn)化String
我們先自定義一個序列化器
package com.ruoyi.common.core.web.converter;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
/**
* 序列化Long類型
*
* @author xianr
* @date 2023/04/13
*/
public class LongJsonSerializer extends JsonSerializer<Long> {
@Override
public void serialize(Long value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
throws IOException {
if (value != null) {
jsonGenerator.writeNumber(value);
}
}
}
然后在不需要指定轉(zhuǎn)換的屬性上添加下面的注解
/** 總記錄數(shù) */
@JsonSerialize(using = LongJsonSerializer.class)
private long total;
到這里大功告成,有幫助的話,請點個贊,謝謝!文章來源:http://www.zghlxwxcb.cn/news/detail-787197.html
記錄一個小細(xì)節(jié):
如果不生效,確認(rèn)下,是否掃描到@Configuration配置類。文章來源地址http://www.zghlxwxcb.cn/news/detail-787197.html
到了這里,關(guān)于spring Boot處理返回給前端Long類型精度丟失的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!