it编程 > 编程语言 > Java

Springboot3+将ID转为JSON字符串的详细配置方案

9人参与 2025-06-11 Java

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
    @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 推荐做法 。

3. 精准控制(可选)

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

@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();
                }
            });
        }
    });
}

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");
                    }
                });
            }
        });
    };
}

使用步骤总结

引入依赖 - 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字符串内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

06-11

Mybatis的分页实现方式

06-11

MybatisPlus service接口功能介绍

06-11

Mybatis Plus Join使用方法示例详解

06-11

MyBatis ResultMap 的基本用法示例详解

06-11

Java中实现线程的创建和启动的方法

06-11

猜你喜欢

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

发表评论