问题背景:
在后端传输数据的时候,前端接受了17位导致数据的精度不够,数据接收错误
问题产生:
- 前端页面ID字段数据丢失,这个就严重了。
- JavaScript能处理的数据精度有限,长度一旦超过17位就会发生长度丢失。
- 因此,id值在被序列化为JSON时经常会有后几位与原数据匹配不上的问题。
理论解决方法:
- 修改Long类型为String,,但缺点很明显,就是失去了Long的优势。,改动太大
- (为什么用Long作为Id字段在我的另一篇博客中)
- 地址:用Long作为Id的类名的优势-CSDN博客
- 在 JavaScript 中,可以使用 BigInt 类型来处理大整数,
- BigInt 类型可以表示任意大的整数,
- 但是需要注意的是,BigInt 类型只能在较新版本的浏览器中使用。如果需要兼容旧版本浏览器,可以使用第三方库来实现大整数的运算。
- 也可以用非侵入式修改,在所有返回Long类型的接口中使用这个自定义的消息转换器,将Long类型转换位String类型
实现:(非侵入式实现)
package com.aqiuo.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;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
public class WebJsonConverterConfig implements WebMvcConfigurer {
// 配置Jackson的MappingJackson2HttpMessageConverter
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
// 创建MappingJackson2HttpMessageConverter实例
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
// 获取ObjectMapper实例
ObjectMapper objectMapper = converter.getObjectMapper();
// 创建SimpleModule实例,用于配置Jackson模块
SimpleModule simpleModule = new SimpleModule();
// 将Long类型序列化为字符串
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
// 注册SimpleModule到ObjectMapper中
objectMapper.registerModule(simpleModule);
// 返回配置好的MappingJackson2HttpMessageConverter
return converter;
}
// 扩展HttpMessageConverters,添加自定义的MappingJackson2HttpMessageConverter
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(mappingJackson2HttpMessageConverter());
}
}
这样修改了全局的Long类型在传输过程中自动转换为String类型,避免了精度丢失。