雪花算法导致返回前端ID不一致问题

第一次引入雪花算法当作生成主键,遇到问题如下:

前端请求获取的response的值,ID和后端返回的值不一致,排查了很久发现是前端在获取时将Long类型值转换超范围导致丢失精度

Java后端Long类型的范围

  • -2^63~2^63,即:-9223372036854775808~9223372036854775807,它是19位的。
  • 这个数字可以通过方法获得:Long.MAX_VALUE、Long_MIN_VALUE。

前端JS的数字类型的范围

  • -2^53~2^53,即:-9007199254740991~9007199254740991,它是16位的。
  • 这个数字可以通过方法获得:Number.MAX_SAFE_INTEGER、Number.MIN_SAFE_INTEGER。

解决办法

1. 全局处理  

自定义ObjectMapper

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
 
@Configuration
public class JacksonConfig {
 
    @Bean
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
 
        // 全局配置序列化返回 JSON 处理
        SimpleModule simpleModule = new SimpleModule();
        // 将使用String来序列化Long类型
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
        objectMapper.registerModule(simpleModule);
        return objectMapper;
    }
}

2. 局部处理

在字段上加:@JsonSerialize(using= ToStringSerializer.class)

    @Id
    @GeneratedValue(generator = "myIDGenerator")
    @JsonSerialize(using= ToStringSerializer.class)
    private Long id;

注意:全局处理会将分页参数页码、总条数值也转成string类型

你可能感兴趣的:(spring,data,jpa,前端)