js long类型精度丢失_后端Long类型传到前端精度丢失的正确解决方式

原因:前端js对Long类型支持的精度不够,导致后端使用的Long传到前端丢失精度,比如现在分布式id生成算法“雪花算法”在使用中就会出现问题。

解决方式:

1、后端的Long类型的id转用String存储,不推荐,失去了其Long类型本身的意义。

2、在Long类型字段上使用注解标明序列化方式,代码量不大的情况可以考虑

@JsonSerialize(using = ToStringSerializer.class)private Long id;

3、实现WebMvcConfigurer接口,重写configureMessageConverters方法

@Overridepublic void configureMessageConverters(List>converters) {

MappingJackson2HttpMessageConverter jackson2HttpMessageConverter=

newMappingJackson2HttpMessageConverter();

ObjectMapper objectMapper= newObjectMapper();

SimpleModule simpleModule= newSimpleModule();

simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance);

simpleModule.addSerializer(Long.class, ToStringSerializer.instance);

simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);

objectMapper.registerModule(simpleModule);

jackson2HttpMessageConverter.setObjectMapper(objectMapper);

converters.add(jackson2HttpMessageConverter);

converters.add(newStringHttpMessageConverter(StandardCharsets.UTF_8));

}

但是这种方式需要开启@EnableWebMvc注解。

开启这个注解意味着springboot的mvc等自动配置失效,所以这个方式实际上也是不可取的。

类似不可取的还有重写HttpMessageConverters,这会覆盖其他的类型转换。

@Configurationpublic classLongToJsonConfig {publicLongToJsonConfig() {

}

@BeanpublicHttpMessageConverters customConverters() {

MappingJackson2HttpMessageConverter jackson2HttpMessageConverter= newMappingJackson2HttpMessageConverter();

ObjectMapper objectMapper= newObjectMapper();

SimpleModule simpleModule= newSimpleModule();

simpleModule.addSerializer(Long.class, ToStringSerializer.instance);

simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);

objectMapper.registerModule(simpleModule);

jackson2HttpMessageConverter.setObjectMapper(objectMapper);return new HttpMessageConverters(newHttpMessageConverter[]{jackson2HttpMessageConverter});

}

}

以上方式基本都不可取。

4、重新注册ObjectMapper的Long类型序列化方式,推荐使用,暂时没发现问题。

@Configurationpublic class LongClassMessageConverter implementsInitializingBean {

@Resource

ObjectMapper objectMapper;privateSimpleModule getSimpleModule() {

SimpleModule simpleModule= newSimpleModule();

simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance);

simpleModule.addSerializer(Long.class, ToStringSerializer.instance);//暂时放弃对小long的转换,约定与前端交互数据时,大Long全部转换成字符串//simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);

objectMapper.registerModule(simpleModule);returnsimpleModule;

}

@Overridepublic voidafterPropertiesSet() {

SimpleModule simpleModule=getSimpleModule();

objectMapper.registerModule(simpleModule);

}

}

5、重新构建Jackson序列化方式,与第四点类似的解决方式,推荐使用。

@Configurationpublic classJacksonConfig {/*** Jackson全局转化long类型为String,解决jackson序列化时传入前端Long类型缺失精度问题*/@BeanpublicJackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {

Jackson2ObjectMapperBuilderCustomizer cunstomizer= newJackson2ObjectMapperBuilderCustomizer() {

@Overridepublic voidcustomize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {

jacksonObjectMapperBuilder.serializerByType(BigInteger.class, ToStringSerializer.instance);

jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance);//jacksonObjectMapperBuilder.serializerByType(Long.TYPE, ToStringSerializer.instance);

}

};returncunstomizer;

}

}

6、以上方式针对springboot默认的Jackson序列化,fastjson等其他json组件类似处理。

7、如果前端自身涉及到Long类型的计算,那么需要前端自己实现Long类型支持,参考:https://github.com/dcodeIO/long.js

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值