lvxianchao / notes

狗屁不通瞎写的博客
https://coderlxc.com
1 stars 0 forks source link

处理前后端通讯 Long 类型精度丢失的问题 #54

Open lvxianchao opened 1 year ago

lvxianchao commented 1 year ago

处理前后端通讯 Long 类型精度丢失的问题

后端处理

后端处理的思路是配置 Jackson,在序列化时将 Long 类型和 long 类型序列化成 String 类型:

package BusinessHelper.config;

import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.math.BigInteger;

/**
 * Author: hcryeo
 * Date: 2023-05-11 13:44
 * Description:
 */
@Slf4j
@Configuration
public class JacksonConfig {

    /**
     * 注册 Jackson 全局 Long 类型转为 String 类型,解决前端 Long 类型精度丢失的问题
     *
     * @return Jackson2ObjectMapperBuilderCustomizer
     */
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return jacksonObjectMapperBuilder -> {
            jacksonObjectMapperBuilder.serializerByType(BigInteger.class, ToStringSerializer.instance);
            jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance);
        };
    }

}

以上代码只处理了 Long 类型,并没有处理 long 类型,如果想要处理 long 类型,再加一行:

jacksonObjectMapperBuilder.serializerByType(Long.TYPE, ToStringSerializer.instance);

前端处理

前端处理的思路是,利用 Axios 的 transformResponse 在 JSON 数据尚未传递给 then/catch 之前,对内容进行拦截处理,使用 json-bigint 库进行解析 JSON:

import JSONbig from "json-bigint";

axios({
    transformResponse: [
        data => JSONbig.parse(data),
    ],
})