2021-06-10   


今天遇到一个小bug,后台返值给前台时,Long类型的数字值不对,断点跟踪后发现接口反值是对的,到了前台就变了,把类型改为String后前台就接收到一致的值了,猜测是json序列化的问题,网上查询验证了猜测并找到解决方案,在此做记录。

原因: java中得long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)。

既然知道了原因,那么解决方法就是自定义springMvc中的json序列化的配置

解决方法:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
 
    /**
     * 利用fastJson替换掉jackson,且解决中文乱码问题
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters){
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.DisableCircularReferenceDetect,
                SerializerFeature.WriteMapNullValue,
                SerializerFeature.WriteNullNumberAsZero,
                SerializerFeature.WriteNullStringAsEmpty,
                SerializerFeature.WriteNullListAsEmpty,
                SerializerFeature.WriteNullBooleanAsFalse,
                SerializerFeature.WriteNonStringKeyAsString,
                SerializerFeature.BrowserCompatible);
 
        //解决Long转json精度丢失的问题
        SerializeConfig serializeConfig = SerializeConfig.globalInstance;
        serializeConfig.put(BigInteger.class, ToStringSerializer.instance);
        serializeConfig.put(Long.class, ToStringSerializer.instance);
        serializeConfig.put(Long.TYPE, ToStringSerializer.instance);
        fastJsonConfig.setSerializeConfig(serializeConfig);
 
        //处理中文乱码问题
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
 
        fastConverter.setSupportedMediaTypes(fastMediaTypes);
        fastConverter.setFastJsonConfig(fastJsonConfig);
        converters.add(fastConverter);
    }
 
}

Q.E.D.


我并不是什么都知道,我只是知道我所知道的。