雪花算法,具体的就不介绍了,搜索引擎一大堆。雪花算法生成的一共是19位long型数字,可以保证增长趋势。 如果把数据发送到前端,前端js接收后会转number,而js的number最大长度只有16位,所以就会产生精度丢失的问题。如果我们用了雪花算法做id,那么前端根据id将查询不到数据。
从大的方面说,主要有两种解决方法:
-
后端把long转换位string发送到前端,具体有以下几种做法 (1). 把需要转换的字段加上序列化注解,在序列化的时候就转成string
@JsonSerialize(using = ToStringSerializer.class) private Long id;
(2). 全局配置,直接修改全局的序列化器,把所有的long都转成string
SimpleModule simpleModule = new SimpleModule();
//long转string
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
(3). 笔者后端使用的mongo存储此次业务数据,并未建立实体pojo,这种情况可以自己处理,把long转位string
Document find = new Document();
find.put("softwareId",softwareId);
Spliterator<Document> spliterator = mongoTemplate.getCollection(MongoConstant.PARAM_TEMPLATE).find(find).spliterator();
List<Document> logList = StreamSupport.stream(spliterator, false).map(doc->{
doc.put("_id",String.valueOf(doc.get("_id")));
return doc;
}).collect(Collectors.toList());
- 既然精度丢失发生在前端,也可以从前端入手,替换反序列化支持long的json反序列化工具,但是考虑到目前的主流json反序列化工具都会把数字类型反序列化成number,而使用第三方工具可能引发其他问题,本次暂不做深究,感兴趣的小伙伴可以尝试以下。
本文由 转啊转 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2019/04/30 15:29