sping boot(Jackson)中Long转换为JSON数值溢出的处理

41 篇文章 1 订阅
38 篇文章 0 订阅
当Java的Long类型超过JavaScript的Number最大值时,会导致序列化后的值不一致。为避免此问题,可以通过在VO和DTO中将Long类型序列化为JSON字符串。一种方法是在Long属性上添加Jackson的序列化注解,另一种是全局配置Jackson,使所有Long自动转为String。如果需要某些Long属性仍为JSONnumber,可以使用特定注解进行标记。
摘要由CSDN通过智能技术生成

由于JavaScript中的number最大值为9007199254740992(最大安全值),而java中Long最大为9223372036854775807L,所以在使用VO,DTO中为Long类型超过js最大值是就会出现值不一致的问题,一般的解决办法是把Long类型序列化成json string类型

方式一: 在VO中Long类型属性增加序列化注解

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; 
......   
    // 如果是long需要序列化为String,避免JSON数字溢出
    @JsonSerialize(using= ToStringSerializer.class)
    private Long id;

方式二:定义一个通用的Long序列化处理器

/*
 * Copyright (c) huggingai(huangguoliang)  copyright message.   2022-2122.   All rights reserved.
 */

package com.huggingai.ai.taskmanager.config;

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

/**
 * 所有的Long自动转换为String,编码json最大值溢出
 *
 * @author hank
 */
@Configuration
public class LongToStringAutoConfig {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance)
                .serializerByType(Long.TYPE, ToStringSerializer.instance);
    }

}

注意: 使用这种方式所有的VO,DTO中的Long都将序列化为json的string类型,如果某些Long属性需要序列化为json number型需要添加序列化注解:

/*
 * Copyright (c) huggingai(huangguoliang)  copyright message.   2022-2122.   All rights reserved.
 */

package com.huggingai.common.entity.vo;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.List;

/**
 * 分页信息
 *
 * @author hank
 * @since 2023/1/1 11:58
 */
@ApiModel
@Data
public class PageVO<T> {
    @ApiModelProperty(value = "总记录数")
    @JsonSerialize(as = Number.class)
    private Long total;

    @ApiModelProperty(value = "数据列表")
    private List<T> records;

    @ApiModelProperty(value = "当前页码")
    @JsonSerialize(as = Number.class)
    private Long current;

    @ApiModelProperty(value = "每页条数")
    @JsonSerialize(as = Number.class)
    private Long size;

    @ApiModelProperty(value = "总页数")
    @JsonSerialize(as = Number.class)
    private Long pages;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值