今天让我们在Entity、DTO、VO上都加@JsonSerialize注解,细问之下才发现前后端数据交互可能会有问题。
JavaScript中数字是Number类型,我们一般的数据库id字段都是雪花算法+uuid,采用Long类型存储。
这样就会由一个问题,我们需要知道Long类型的最大值和最小值在JavaScript中是否能够正常转化,如果超出了可转化的最大值
那么会出现精度丢失的问题,于是我先看一下Java的Long类型的最大值和最小值分别是多少
public static void main(String[] args) {
Long maxNumber = Long.MAX_VALUE;
Long minNumber = Long.MIN_VALUE;
System.out.println("Long的最大值为: "+ maxNumber);
System.out.println("Long的最小值为: "+ minNumber);
}
结果是
我们再看一下js的
const maxNumber = Number.MAX_SAFE_INTEGER;
const minNumber = Number.MIN_SAFE_INTEGER;
console.log("Number的最大值为: "+ maxNumber);
console.log("Number的最小值为: "+ minNumber);
我们发现,我们Java中Long类型远大于JavaScript中的Number整数类型,如果大于Number能表示的最大整数类型,那么一定会产生精度问题,所以我们采用@JsonSerialize(using = ToStringSerialize.class)注解。
它在我们返回给前端时,将我们的Long类型转化为String类型,这样前端接收到的数值可以保证是精确的,保证数据的精确性。