springboot中使用FastJson解决long类型在js中失去精度的问题

作者:Nightliar 时间:2022-04-05 05:15:27 

使用FastJson解决long类型在js中失去精度问题

1.pom中需要将默认的jackson排除掉

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <!-- json库统一使用fastjson -->
        <exclusion>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </exclusion>
    </exclusions>
</dependency>

2.利用fastJson替换掉jackson

package com.nightliar.bootdemo.config.spring;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.serializer.ToStringSerializer;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import com.nightliar.bootdemo.interceptor.GlobalInterceptor;
import com.nightliar.bootdemo.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Nightliar
* 2018-08-15 11:09
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
   /**
    * 添加 *
    */
   @Override
   public void addInterceptors(InterceptorRegistry registry){
       //全局 *
       registry.addInterceptor(new GlobalInterceptor())
               .addPathPatterns("/**")
               .excludePathPatterns("/static/**");
       //登陆 *
       registry.addInterceptor(new LoginInterceptor())
               .addPathPatterns("/**")
               .excludePathPatterns("/static/**");
   }
   /**
    * 利用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);
   }
}

springboot long精度缺失问题

 /**
     * 解决Jackson导致Long型数据精度丢失问题
     * @return
     */
    @Bean("jackson2ObjectMapperBuilderCustomizer")
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        Jackson2ObjectMapperBuilderCustomizer customizer = new Jackson2ObjectMapperBuilderCustomizer() {
            @Override
            public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
                jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance)
                        .serializerByType(Long.TYPE, ToStringSerializer.instance);
            }
        };
        return customizer;
}

问题

jackson2ObjectMapperBuilderCustomizer不生效

主要是重复了

在WebMvcConfigurer中添加

@Autowired(required = false)
    private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter;
 
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter);
        if (Objects.isNull(mappingJackson2HttpMessageConverter)) {
            converters.add(0, new MappingJackson2HttpMessageConverter());
        } else {
            converters.add(0, mappingJackson2HttpMessageConverter);
        }
}

来源:https://blog.csdn.net/Nightliar/article/details/82351963

标签:springboot,FastJson,long类型,精度
0
投稿

猜你喜欢

  • Android12 蓝牙适配的实现步骤

    2021-08-25 08:36:34
  • Java全面细致讲解类与对象

    2022-07-07 07:04:42
  • SpringBoot中定时任务@Scheduled注解的使用解读

    2022-11-24 17:20:11
  • Java抽象类的概念讲解

    2023-11-04 13:40:35
  • C语言非递归后序遍历二叉树

    2023-12-13 18:05:45
  • Unity屏幕雪花另类实现方式示例

    2022-06-18 23:32:43
  • C#如何消除验证码图片的锯齿效果

    2023-11-05 04:49:14
  • C++内存模型与名称空间概念讲解

    2023-07-15 03:43:43
  • Spark网站日志过滤分析实例讲解

    2021-06-08 12:59:24
  • 基于Mybatis-Plus的CRUD的实现

    2023-09-10 14:38:45
  • Java毕业设计实战项目之宠物商城系统的实现流程

    2022-03-02 06:10:41
  • java设计模式之工厂方法模式

    2022-08-29 05:14:10
  • C# WinForm实现自动更新程序的方法详解

    2021-12-12 16:19:54
  • c++中的malloc底层实现代码

    2023-11-02 19:49:18
  • Java Web开发过程中登陆模块的验证码的实现方式总结

    2022-01-29 19:33:16
  • 使用注解@Recover优化丑陋的循环详解

    2021-08-05 15:11:13
  • 简单了解Java字符串(操作)

    2022-04-22 18:37:29
  • C#开发的人脸左右相似度计算软件源码分析

    2023-08-26 05:18:41
  • C# 正则判断一个数字的格式是否有逗号的代码

    2021-09-13 07:42:12
  • SpringBoot实战之SSL配置详解

    2022-08-03 19:38:17
  • asp之家 软件编程 m.aspxhome.com