Java中Long类型传入前端数值出错问题
1.问题描述
做数据资产交易项目发现,在列表点击详情时,没有得到对应的详情页面,从后端请求数据部分都为空
通过查看网络请求看到,请求的data值时null,而不是对应的详情数据,
查看请求,发现请求对应的id并不是产品的id,最后几位数值出现错误,之后在数据列表的响应中发现,数据的id也都是错误的,都是在第16位或者第17位进行了四舍五入,后续数字都为0。
之后找到的问题的根源,在mysql数据库中,Java中的Long类型对应其中的bigInt类型,支持20位,而前端接收Long类型的数值(超过16位)时,会对第16位进行四舍五入,17位及之后补0,因此造成数值出错。
2.解决办法
在通过查找后,找到了对应的解决办法,均为将后端的返回值中的id转化位String类型,下列为具体解决办法。
2.1 修改id的类型为String
这种方法并不是很好,因为id的Long类型,对应数据库中的bigInt类型,数据库中一般都使用bigInt来表示id,因此这样修改会导致之后会有很多地方需要修改,因此并不推荐
2.2 在id进行序列化时,以String形式序列化
这种方法并没有上述方法的问题
2.2.1 使用StringBoot的Jackson依赖中包
- 单个数据
此处使用的为Jackson下的ToStringSerializer
@JsonSerialize(using = ToStringSerializer.class) private Long productId;
- 针对所有的Long类型数据(将所有的Long类型的数据改变的序列化方式)
通过添加配置类来解决这个问题
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.json.Jackson2ObjectMapperBuilder; @Configuration public class JacksonConfig { @Bean @Primary @ConditionalOnMissingBean(ObjectMapper.class) public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = builder.createXmlMapper(false).build(); SimpleModule simpleModule = new SimpleModule(); //Long类型----String simpleModule.addSerializer(Long.class, ToStringSerializer.instance); objectMapper.registerModule(simpleModule); return objectMapper; } }
2.2.2 使用FastJson
- 单个数据
此处使用的为FastJSON下的ToStringSerializer
@JSONField(serializeUsing = ToStringSerializer.class) private Long productId;
- 多个数据
通过重写WebMvcConfigurer中的configureMessageConverters方法重新配置转换器
import com.alibaba.fastjson.serializer.SerializeConfig; import com.alibaba.fastjson.serializer.ToStringSerializer; import com.alibaba.fastjson.support.config.FastJsonConfig; import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class CustomFastJsonConfig { @Bean FastJsonHttpMessageConverter fastJsonHttpMessageConverter() { //1.定义convert转换消息的对象 FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); //2.添加fastJson的配置信息 FastJsonConfig fastJsonConfig = new FastJsonConfig(); //3.设置Long为字符串 SerializeConfig serializeConfig = SerializeConfig.globalInstance; serializeConfig.put(Long.class, ToStringSerializer.instance); serializeConfig.put(Long.TYPE, ToStringSerializer.instance); fastJsonConfig.setSerializeConfig(serializeConfig); //4.在convert中添加配置信息. converter.setFastJsonConfig(fastJsonConfig); return converter; } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
mybatis拦截器无法注入spring bean的问题解决
本文主要介绍了mybatis拦截器无法注入spring bean的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2022-02-02Java Swing JComboBox下拉列表框的示例代码
这篇文章主要介绍了Java Swing JComboBox下拉列表框的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-12-12
最新评论