Java前后端交互long类型溢出的解决方案

问题描述:

前端根据id发起请求查找对象的时候一直返回找不到对象,然后查看了请求报文,发现前端传给后台的数据id不对,原本的id是1435421253099634623,可前端传过来的id是 1435421253099634700,后三位变成了700。
出现这种情况的原因是前端的js语言最大支持16位的数字,而后台用的是19位的雪花id,所以导致前端处理时精度溢出了。

解决方案:

后端将超过前端支持范围的int类型转换成字符串,即将long 转成 string


有两种解决方式:

1、使用 @JsonSerialize(using = ToStringSerializer.class) (按需配置)
这种方式非常简单,直接在返回前端的VO对象中的Long属性上写个注解就可以。然后返回前端的json报文中的Long值就变成了String字符串。

    // import com.fasterxml.jackson.databind.annotation.JsonSerialize;
    // import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;

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

2、全局配置(注意扫描路径)(简单粗暴、不需要每个地方都去配置,影响全局)

@Configuration
public class SerializerConfig {
    /**
     * 解决主键Long类型返回给页面时,页面精度丢失的问题,时间格式化返回
     */
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance).addSerializer(Long.TYPE, ToStringSerializer.instance);
        simpleModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        simpleModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        simpleModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
        simpleModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        simpleModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        simpleModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
        objectMapper.registerModule(simpleModule);
        return objectMapper;
    }
}

你可能感兴趣的:(java)