雪花算法生成的Id过长,前端接收精度丢失

发布时间 2023-04-07 15:15:41作者: Smith_J

1.问题现象:

 表的Id使用雪花算法生成,数据库使用bigint类型可以正常存储,后端使用Long类型也可以正常接收,postman进行请求测试,也可以看到后端正常返回的数据,但是前端接收后显示的id不正常。

2.问题原因:

 前端使用number类型进行接收,number类型的范围小于后台Long类型的范围,出现了精度丢失问题。

3.解决方案:

 使用@JsonSerialize(using = ToStringSerializer.class)@JsonDeserialize(using = ToLongSerializer.class)注解

 @JsonSerialize(using = ToStringSerializer.class):是将Long类型的数据转为字符串类型,进而可以让前端使用String类型接收,解决精度丢失问题。

 @JsonDeserialize(using = ToLongSerializer.class):是将String类型转换为Long类型,便于后台进行数据处理。ToLongSerializer类须手动编写代码实现。

4.示例:

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

ToLongSerializer类实现:
public class ToLongSerializer extends JsonDeserializer<Long> {
@Override
public Long deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
if(StringUtils.isNull(jsonParser)){
return null;
}
return new Long(jsonParser.getText());
}
}

5.参考内容:

 https://zhuanlan.zhihu.com/p/197148602

 https://blog.csdn.net/jianxia801/article/details/124034856