SpringBoot基于Jackson解决Long型长度丢失问题

 更新时间:2025年08月21日 09:18:36   作者:future romance  
本文主要介绍了SpringBoot基于Jackson解决Long型长度丢失问题,通过自定义Jackson ObjectMapper子类添加String序列化器,并在SpringMVC配置中注册该转换器,使ID在JSON传输中保持完整,与数据库数据一致

问题背景

JavaScript能处理的数据精度有限,长度一旦超过17位就会发生长度丢失。因此,id值在被序列化为JSON时经常会有后几位与原数据匹配不上的问题。

数据库中的数据

可以发现页面拿到的数据的id值和数据库中的id值最后两位不一致

为了解决该问题,可以将Long型转化为String
可利用jackson的ObjectMapper来实现

解决方法

ObjectMapper(对象转换器),是jackson中的一个类,它实现了java对象到JSON之间的转换(序列化、反序列化)。

当ObjectMapper中固有的序列化器(或反序列化器)不能满足我们的需求时,我们需要自定义一个对象转换器,即创建 ObjectMapper 的子类,为其添加新的序列化器,例如 (Long --> String) 的序列化器

实现步骤

1. 自定义对象转换器,添加序列化器(或反序列化器)

2. 将该对象转换器加入到 SpringMVC 的消息转换器队列中

自定义的对象转换器即为ObjectMapper的子类,为其添加序列化器

/**
 * 对象转换器 ObjectMapper:基于jackson将Java对象转为json(序列化),或者将json转为Java对象(反序列化)
 *
 *          ObjectMapper中固有的序列化器(或反序列化器)可能不能满足我们的需求
 *      因此需要创建 ObjectMapper 的子类,自定义新的序列化器,例如 Long --> String 的序列化器
 *
 */
public class JacksonObjectMapper extends ObjectMapper {

    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

    public JacksonObjectMapper() {
        super();
        //收到未知属性时不报异常
        this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);

        //反序列化时,属性不存在的兼容处理
        this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        // SimpleModule对象,添加各种序列化器和反序列化器
        SimpleModule simpleModule = new SimpleModule()
                // 添加反序列化器
                .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))

                // 添加序列化器
                .addSerializer(BigInteger.class, ToStringSerializer.instance)
                .addSerializer(Long.class, ToStringSerializer.instance)   // 实现 Long --> String 的序列化器
                .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));

        // 对自定义的 simpleModule 进行注册
        this.registerModule(simpleModule);
    }
}

现在已经创建出了自定义的对象转换器,但还无法生效,需要对它进行相关配置

在WebMVC配置类中,重写extendMessageConverters方法,将自定义的对象转换器加入到消息转换器队列中,使其生效

/**
     * 扩展 Spring MVC 的消息转换器
     *
     *      将自定义的对象转换器 JacksonObjectMapper 加入到 SpringMVC 的消息转换器队列中
     *
     * @param converters
     */
    @Override
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        log.info("扩展消息转换器......");

        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();

        messageConverter.setObjectMapper(new JacksonObjectMapper());

        converters.add(0, messageConverter);

    }

再次测试结果如下

可以发现此时页面拿到的id值都已经变成了String,而且与数据库中的id值完全一致

如此,便解决了Long型长度丢失问题

到此这篇关于SpringBoot基于Jackson解决Long型长度丢失问题的文章就介绍到这了,更多相关SpringBoot Long型长度丢失内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java多态概念、实现机制与实践应用详解

    Java多态概念、实现机制与实践应用详解

    多态是指同一个方法在不同对象上具有不同的行为,通过多态程序可以在运行时决定调用哪个方法,从而提高代码的灵活性和可扩展性,这篇文章主要介绍了Java多态概念、实现机制与实践应用的相关资料,需要的朋友可以参考下
    2026-01-01
  • mybatis-plus与JPA混合的使用方式

    mybatis-plus与JPA混合的使用方式

    这篇文章主要介绍了mybatis-plus与JPA混合的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Java实现时间和字符串互转

    Java实现时间和字符串互转

    这篇文章主要为大家详细介绍了如何通过Java实现时间对象和字符串互相转换,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-10-10
  • Java之String[] args含义及作用

    Java之String[] args含义及作用

    这篇文章主要介绍了Java之String[] args含义及作用,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Java并发编程之CountDownLatch的使用

    Java并发编程之CountDownLatch的使用

    CountDownLatch是一个倒数的同步器,常用来让一个线程等待其他N个线程执行完成再继续向下执行,本文主要介绍了CountDownLatch的具体使用方法,感兴趣的可以了解一下
    2023-05-05
  • Java之格式化输出实践

    Java之格式化输出实践

    这篇文章主要介绍了Java之格式化输出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-04-04
  • java必学必会之this关键字

    java必学必会之this关键字

    java必学必会之this关键字,java中this的用法进行了详细的分析介绍,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • 如何解决Could not transfer artifact org.springframework.boot问题

    如何解决Could not transfer artifact org.spri

    在Maven更新过程中遇到“Could not transfer artifact org.springframework.boot”错误通常是由于网络问题,解决方法是在Maven的设置中忽略HTTPS,添加特定语句后,可以正常下载依赖,但下载速度可能较慢,这是一种常见的解决方案,希望对遇到相同问题的人有所帮助
    2024-09-09
  • JAVA设计模式之建造者模式原理与用法详解

    JAVA设计模式之建造者模式原理与用法详解

    这篇文章主要介绍了JAVA设计模式之建造者模式,简单说明了建造者模式的原理、组成,并结合实例形式分析了java建造者模式的定义与用法,需要的朋友可以参考下
    2017-08-08
  • Spring MVC各种参数进行封装的方法实例

    Spring MVC各种参数进行封装的方法实例

    这篇文章主要给大家介绍了关于Spring MVC各种参数进行封装的相关资料,SpringMVC内置多种数据类型转换器,可以根据请求中的参数与后端控制器方法的参数的关系为我们实现简单的数据封装,需要的朋友可以参考下
    2023-06-06

最新评论