Springboot3+的id字符串转化问题

以下是纯后端实现 Long/BigInteger ID 转为 JSON 字符串 的详细配置方案,基于 Spring Boot 3+ 和 SpringDoc (OpenAPI) 最新实践 ✨


1. 添加依赖

确保你的 pom.xml(或 Gradle)中包含:

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId>
</dependency>
<dependency><groupId>com.fasterxml.jackson.datatype</groupId><artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.x</version>
</dependency>

2. 全局 Jackson 配置

创建一个全局 ObjectMapper,让所有 Long 类型自动序列化为字符串:

@Configuration
public class JacksonConfig {@Bean@Primarypublic ObjectMapper objectMapper() {ObjectMapper mapper = new ObjectMapper();// Java 8 日期时间支持mapper.registerModule(new JavaTimeModule());mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);// 去掉 null 字段mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);// 将 Long / long 转为 StringSimpleModule idModule = new SimpleModule();idModule.addSerializer(Long.class, ToStringSerializer.instance);idModule.addSerializer(Long.TYPE, ToStringSerializer.instance);idModule.addSerializer(BigInteger.class, ToStringSerializer.instance);mapper.registerModule(idModule);return mapper;}
}

上述配置无需在 POJO 上添加注解,确保所有后端输出中的 Long/BigInteger 都以字符串形式传输。这是社区常用解决方案,也是 StackOverflow 推荐做法 (github.com, stackoverflow.com)。


3. 精准控制(可选)

如有需求,仅针对某些字段转换,新增注解支持:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
@JacksonAnnotationsInside
@JsonSerialize(using = ToStringSerializer.class)
public @interface StringId {}

使用方式:

public class User {@StringIdprivate Long id;private String name;
}

并在全局配置中扫描该注解,使用 BeanSerializerModifier 判断并替换:

@Bean
public Jackson2ObjectMapperBuilderCustomizer customIdSerializer() {return builder -> builder.modules(new SimpleModule() {@Overridepublic void setupModule(SetupContext context) {context.addBeanSerializerModifier(new BeanSerializerModifier() {@Overridepublic List<BeanPropertyWriter> changeProperties(SerializationConfig config,BeanDescription beanDesc,List<BeanPropertyWriter> props) {return props.stream().map(writer -> {if (writer.getAnnotation(StringId.class) != null) {return writer.withSerializer(ToStringSerializer.instance);}return writer;}).toList();}});}});
}

4. OpenAPI (SpringDoc) 类型同步

为了 Swagger 文档中显示 ID 为 “string” 而不是 “integer”,增加 OpenAPI 自定义:

@Bean
public OpenApiCustomiser idAsStringSchemaCustomizer() {return openApi -> {openApi.getComponents().getSchemas().forEach((name, schema) -> {if (schema.getProperties() != null) {schema.getProperties().forEach((propName, propSchema) -> {if (propName.toLowerCase().endsWith("id") && "integer".equals(propSchema.getType())) {propSchema.setType("string");propSchema.setFormat("int64");}});}});};
}

📌 使用步骤总结

  1. 引入依赖 - Jackson、JSR‑310、SpringDoc。
  2. 配置全局 ObjectMapper - Long/String 自动转换。
  3. (可选)添加 @StringId 注解 - 精细控制。
  4. 同步 OpenAPI Schema 类型 - Swagger 查看准确。
  5. 测试验证:序列化、反序列化均正常。

✅ 测试示例

@SpringBootTest
public class IdConversionTest {@Autowired ObjectMapper mapper;@Testvoid testLongToString() throws Exception {TestEntity e = new TestEntity();e.setId(1234567890123456789L);String json = mapper.writeValueAsString(e);assertTrue(json.contains("\"id\":\"1234567890123456789\""));}@Testvoid testStringToLong() throws Exception {String json = "{\"id\":\"1234567890123456789\"}";TestEntity e = mapper.readValue(json, TestEntity.class);assertEquals(1234567890123456789L, e.getId());}static class TestEntity { Long id; /* getter-setter */ }
}

这样可以 无感 在后端处理,前端收到字符串,避免 JS 精度问题,同时 Swagger 文档也保持一致。
如果需要我帮你快速落地这套配置在你项目中,可以提供你 Spring Boot 和 SpringDoc 版本,我来进一步定制配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#学习第30天: 匹配模式

模式匹配&#xff08;Pattern Matching&#xff09;是 C# 中一个强大且灵活的特性&#xff0c;允许开发者以更直观的方式检查数据结构&#xff0c;并根据特定模式执行操作。 随着 C# 语言版本的发展&#xff0c;模式匹配的功能越来越丰富&#xff0c;为处理复杂数据提供了极大…

SQL进阶之旅 Day 29:NoSQL结合使用策略

【SQL进阶之旅 Day 29】NoSQL结合使用策略 文章简述 随着数据量的激增和业务场景的复杂化&#xff0c;传统关系型数据库在某些场景下已难以满足高性能、高扩展性和灵活数据结构的需求。NoSQL&#xff08;非关系型数据库&#xff09;以其高可扩展性、灵活的数据模型和分布式架构…

PostgreSQL 对 IPv6 的支持情况

PostgreSQL 对 IPv6 的支持情况 PostgreSQL 全面支持 IPv6 网络协议&#xff0c;包括连接、存储和操作 IPv6 地址。以下是详细说明&#xff1a; 一、网络连接支持 1. 监听 IPv6 连接 在 postgresql.conf 中配置&#xff1a; listen_addresses 0.0.0.0,:: # 监听所有IPv4…

模板字符串使用点击事件【VUE3】

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 项目中使用模板字符串的时候很多&#xff0c;有些时候需要再模板字符串中使用点击事件&#xff0c;那么在模板字符串中可以使用点击事件么&#xff1f;如果这个点击事件需要传参呢&#xff1f; 答案…

AI——DeepSeek+LangChain+streamlit 实现智能汽车维修服务

效果图 分析流程 代码实现 废话少说&#xff0c;直接上代码 from langchain_core.language_models.llms import BaseLLM from langchain_core.outputs import Generation, LLMResult from pydantic.v1 import Field, validator from typing import Any, Dict, List, Optional…

《C++ 继承》

目录 继承的定义 继承类模板 派生类和基类之前的转换 隐藏 派生类的默认成员函数 不能被继承的类 继承中的友元和静态成员 继承模型 继承的定义 继承的本质是一种复用。规定Person类为基类&#xff0c;Student类为派生类 。 继承方式分为public继承&#xff0c;prote…

金蝶K3 ERP 跨网段访问服务器卡顿问题排查和解决方法

我一朋友公司反应&#xff0c;公司网络卡顿&#xff0c;测试掉包严重&#xff0c;抓包wireshark测试&#xff0c;发现arp包有大量mac欺骗&#xff0c;因为公司有几百台电脑&#xff0c;所以建议更换了三层交换机&#xff0c;划分了vlan&#xff0c;这样有效的避免了网络风暴等&…

无需安装!在线数据库工具 :实战 SQL 语句经典案例

在数字化时代&#xff0c;SQL&#xff08;结构化查询语言&#xff09;已成为数据从业者、开发人员乃至业务分析人员必备的核心技能。无论是处理日常数据报表&#xff0c;还是应对复杂的业务逻辑&#xff0c;SQL 都能高效实现数据的查询、操作与分析。本文将通过经典的 SQL 练习…

如何在网页里填写 PDF下拉框

对于PDF 开发者或网页开发者来说&#xff0c;让用户在网站上填写 PDF 下拉框&#xff08;Combo Box&#xff09;是一个棘手的问题。因为 PDF 并不是一种原生的 Web 格式&#xff0c;浏览器通常不允许用户与 PDF 下拉框进行交互。 那么&#xff0c;如何让用户在 HTML 中填写 PD…

.Net 优秀框架 ABP全面详解

文章目录 第一部分&#xff1a;ABP框架概述与核心架构1.1 ABP框架简介1.2 ABP框架架构解析1.2.1 表现层(Presentation Layer)1.2.2 分布式服务层(Distributed Service Layer)1.2.3 应用层(Application Layer)1.2.4 领域层(Domain Layer)1.2.5 基础设施层(Infrastructure Layer)…

力扣-198.打家劫舍

题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个房屋…

windows 安装vllm cuda版本

windows 安装cuda版本 查看window cuda版本 nvidia-smi vllm 获取镜像,此版本需要cuda 版本12.8 或以上 docker pull vllm/vllm-openai:latest下载模型 git lfs installcd e:\ai mkdir vllm\models\qwen2cd vllm\models#通过git下载git clone https://www.modelscope.c…

Node.js特训专栏-基础篇:1. Node.js环境搭建与项目初始化详细指南

我将为你详细讲解 Node.js 环境搭建与项目初始化的步骤&#xff0c;包含常见问题解决和最佳实践&#xff0c;帮助你快速上手。 详细步骤说明 1. 环境搭建 Windows用户&#xff1a; 访问Node.js官网(https://nodejs.org)下载LTS版本安装包&#xff08;推荐长期支持版&#xf…

13.安卓逆向2-frida hook技术-HookJava构造方法

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

php基础:常见函数

内建函数 文章目录 内建函数1、文件操作函数&#xff1a;2、代码执行函数&#xff1a;3、反序列化函数&#xff1a;4、数据库操作函数&#xff1a;5、类型转换与比较函数&#xff1a;6、其他常见函数&#xff1a; 1、文件操作函数&#xff1a; include(): 导入并执行指定的 PHP…

教程:PyCharm 中搭建多级隔离的 Poetry 环境(从 Anaconda 到项目专属.venv)

核心思维&#xff1a;为什么需要 “多级隔离”&#xff1f; 在复杂项目中&#xff0c;环境冲突是最棘手的问题&#xff08;比如系统 Python 版本不同、依赖包版本冲突&#xff09;。通过 “Anaconda 虚拟环境 → 项目 Poetry 环境 → 工具级隔离” 的三层架构&#xff0c;实现…

Rollup vs Webpack 深度对比:前端构建工具终极指南

前端工程领域始终面临一个根本选择&#xff1a;如何在模块化编码规范与工程化构建效率之间取得最佳平衡。Rollup与Webpack分别代表着两种不同维度的解决方案&#xff0c;本文将揭示它们的真实应用场景与核心差异。 一、核心差异全景图&#xff08;附最新对比&#xff09; 核心能…

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…

Easy Excel

Easy Excel 一、依赖引入二、基本使用1. 定义实体类&#xff08;导入/导出共用&#xff09;2. 写 Excel3. 读 Excel 三、常用注解说明&#xff08;完整列表&#xff09;四、进阶&#xff1a;自定义转换器&#xff08;Converter&#xff09; 其它自定义转换器没生效 Easy Excel在…

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…