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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于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;
}

### Spring Boot 入门教程及常见问题 #### 什么是 Spring BootSpring Boot 并不是一个全新的框架,而是用于简化基于 Spring 的应用程序开发的一种方式[^4]。通过减少繁琐的 XML 配置和提供开箱即用的功能,Spring Boot 让开发者能够更快地搭建起功能完善的 Java 应用。 --- #### 如何开始一个 Spring Boot 项目? 要创建并运行一个简单的 Spring Boot 项目,需完成以下几个核心步骤: 1. **引入父项目的依赖管理** 在 `pom.xml` 中定义 `spring-boot-starter-parent` 作为父项目,以便继承其版本管理和插件支持。 ```xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> <relativePath/> </parent> ``` 2. **添加必要的 Starter 依赖** 根据需求选择合适的模块化 Starter 依赖。例如,Web 开发、数据库操作等常用场景可以通过如下配置实现: ```xml <dependencies> <!-- Web 开发 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 数据库相关 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- Lombok (简化代码) --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.26</version> <scope>provided</scope> </dependency> </dependencies> ``` 3. **编写主类** 创建带有 `@SpringBootApplication` 注解的入口类,并调用 `SpringApplication.run()` 方法启动应用。 ```java package com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` --- #### 常见问题及其解决办法 以下是开发者在实际使用过程中可能会遇到的一些典型问题及相关解决方案: 1. **无法加载静态资源** 如果发现前端页面中的 CSS 或 JavaScript 文件未被正确加载,可能是由于路径设置错误所致。确保这些文件存放在 `/src/main/resources/static/` 下即可正常访问[^1]。 2. **热部署失效** 默认情况下,修改源码后需要重启服务才能生效。为了提高效率,可启用 DevTools 插件,在不中断程序的情况下实时更新更改内容[^2]: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> ``` 3. **连接数据库失败** 当尝试接入外部数据存储时如果报错,则应仔细核对 application.properties/yml 文件内的 URL 地址、用户名密码参数是否匹配目标实例的要求[^3]。 4. **日志级别调整困难** 可以自定义全局或者特定包的日志记录等级来满足调试需求。比如仅针对 Hibernate SQL 查询语句打印详细信息的话,只需增加下面这行配置命令到 properties 文档里去就行啦! ```properties logging.level.org.hibernate.SQL=DEBUG ``` --- #### 总结 以上便是关于如何开启一段旅程以及途中可能遭遇障碍物处理指南的大致介绍。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值