当前位置: 代码网 > it编程>编程语言>Java > SpringBoot jackson 精度处理问题解决

SpringBoot jackson 精度处理问题解决

2024年10月11日 Java 我要评论
问题说明因为js能处理的最大值和最小值分别是private static final long max_safe_integer = 9007199254740991l;private static

问题说明

因为js能处理的最大值和最小值分别是

private static final long max_safe_integer = 9007199254740991l;
private static final long min_safe_integer = -9007199254740991l;

所以我们的雪花id很容易就超出了这个范围,所以要转换为字符串做适配
例如:1692419165819899402 就会变成1692419165819800000

解决方案

入参

在spring mvc或spring boot中,可以使用@requestbody将字符串类型的json字段映射到java中的long类型字段,只要字符串内容是一个有效的long值。spring的jackson库会自动处理这个转换。需要注意处理可能的转换异常,以确保应用的健壮性。

返回需要配置处理器

实体类字段就可以定义为long类型了

package com.platform.paycenter.config;

import com.fasterxml.jackson.databind.ser.std.tostringserializer;
import com.fasterxml.jackson.datatype.jsr310.javatimemodule;
import com.fasterxml.jackson.datatype.jsr310.deser.localdatetimedeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.localdatetimeserializer;
import com.platform.paycenter.handler.bignumberserializer;
import lombok.extern.slf4j.slf4j;
import org.springframework.boot.autoconfigure.autoconfiguration;
import org.springframework.boot.autoconfigure.jackson.jackson2objectmapperbuildercustomizer;
import org.springframework.boot.autoconfigure.jackson.jacksonautoconfiguration;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;

import java.math.bigdecimal;
import java.math.biginteger;
import java.time.localdatetime;
import java.time.format.datetimeformatter;
import java.util.timezone;

/**
 * jackson 配置
 *
 * @author lion li
 */
@slf4j
@configuration
public class jacksonconfig {

    @bean
    public jackson2objectmapperbuildercustomizer customizer() {
        return builder -> {
            // 全局配置序列化返回 json 处理
            javatimemodule javatimemodule = new javatimemodule();
            javatimemodule.addserializer(long.class, bignumberserializer.instance);
            javatimemodule.addserializer(long.type, bignumberserializer.instance);
            javatimemodule.addserializer(biginteger.class, bignumberserializer.instance);
            javatimemodule.addserializer(bigdecimal.class, tostringserializer.instance);
            datetimeformatter formatter = datetimeformatter.ofpattern("yyyy-mm-dd hh:mm:ss");
            javatimemodule.addserializer(localdatetime.class, new localdatetimeserializer(formatter));
            javatimemodule.adddeserializer(localdatetime.class, new localdatetimedeserializer(formatter));
            builder.modules(javatimemodule);
            builder.timezone(timezone.getdefault());
            log.info("初始化 jackson 配置");
        };
    }

}

package com.platform.paycenter.handler;

import com.fasterxml.jackson.core.jsongenerator;
import com.fasterxml.jackson.databind.serializerprovider;
import com.fasterxml.jackson.databind.annotation.jacksonstdimpl;
import com.fasterxml.jackson.databind.ser.std.numberserializer;

import java.io.ioexception;

/**
 * 超出 js 最大最小值 处理
 *
 * @author lion li
 */
@jacksonstdimpl
public class bignumberserializer extends numberserializer {

    /**
     * 根据 js number.max_safe_integer 与 number.min_safe_integer 得来
     */
    private static final long max_safe_integer = 9007199254740991l;
    private static final long min_safe_integer = -9007199254740991l;

    /**
     * 提供实例
     */
    public static final bignumberserializer instance = new bignumberserializer(number.class);

    public bignumberserializer(class<? extends number> rawtype) {
        super(rawtype);
    }

    @override
    public void serialize(number value, jsongenerator gen, serializerprovider provider) throws ioexception {
        // 超出范围 序列化位字符串
        if (value.longvalue() > min_safe_integer && value.longvalue() < max_safe_integer) {
            super.serialize(value, gen, provider);
        } else {
            gen.writestring(value.tostring());
        }
    }
}

到此这篇关于springboot jackson 精度处理问题解决的文章就介绍到这了,更多相关springboot jackson 精度内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com