SpringBoot的Long传至前台,数值发生变化

本文分析了SpringBoot中Long类型数据传递到前端时数值变化的原因,主要由于JavaScript对大整数的处理限制。提出了通过配置文件、Jackson注解以及自定义Jackson2ObjectMapperBuilderCustomizer来解决精度丢失问题。同时警告避免直接重写HttpMessageConverters,以免引发其他异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.原因分析:

1)JavaScript 语言的底层根本没有整数,所有数字都是小数(64位浮点数)
    1位(s) 用来表示符号位,0表示正数,1表示负数
    11位(e) 用来表示指数部分
    52位(f) 表示小数部分(即有效数字)
精准表示的最大整数是 2^{53} - 1,十进制为 9007199254740991

2)Java的Long类型的有效位数是63位(扣除一位符号位),其最大值为2^{63}-1,十进制为9223372036854775807

2.解决方案:

1)配置文件(全局配置)

spring:
  jackson:
    generator:
      write_numbers_as_strings: true


2)需要的Long字段上添加Jackson注解(局部配置)

@JsonSerialize(using = ToStringSerializer.class)


3.创建一个Jackson2ObjectMapperBuilderCustomizer,对Long型数据的数据序列化进行特殊处理,实现对Jackson2ObjectMapperBuilder的个性化定制(全局配置)。

@Configuration
public class MyJacksonConfig {
    @Bean
    public Jackson2Obj
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值