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.示例:

  导包:
  import com.fasterxml.jackson.annotation.JsonFormat;
  import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
  import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
  import com.common.util.ToLongSerializer;(自定义包)

  字段:
  @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