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