38人参与 • 2025-06-11 • Java
确保你的 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>
创建一个全局 objectmapper,让所有 long 类型自动序列化为字符串:
@configuration
public class jacksonconfig {
@bean
@primary
public 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 转为 string
simplemodule 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 推荐做法 。
如有需求,仅针对某些字段转换,新增注解支持:
@retention(retentionpolicy.runtime)
@target({elementtype.field, elementtype.method})
@jacksonannotationsinside
@jsonserialize(using = tostringserializer.class)
public @interface stringid {}
使用方式:
public class user {
@stringid
private long id;
private string name;
}
并在全局配置中扫描该注解,使用 beanserializermodifier 判断并替换:
@bean
public jackson2objectmapperbuildercustomizer customidserializer() {
return builder -> builder.modules(new simplemodule() {
@override
public void setupmodule(setupcontext context) {
context.addbeanserializermodifier(new beanserializermodifier() {
@override
public 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();
}
});
}
});
}为了 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");
}
});
}
});
};
}使用步骤总结
引入依赖 - jackson、jsr‑310、springdoc。
配置全局 objectmapper - long/string 自动转换。
(可选)添加 @stringid 注解 - 精细控制。
同步 openapi schema 类型 - swagger 查看准确。
测试验证:序列化、反序列化均正常。
@springboottest
public class idconversiontest {
@autowired objectmapper mapper;
@test
void testlongtostring() throws exception {
testentity e = new testentity();
e.setid(1234567890123456789l);
string json = mapper.writevalueasstring(e);
asserttrue(json.contains("\"id\":\"1234567890123456789\""));
}
@test
void 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 版本,我来进一步定制配置。
到此这篇关于springboot3+将id转为json字符串的详细配置方案的文章就介绍到这了,更多相关springboot id转json字符串内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论