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

 更新时间:2025年06月11日 16:12:03   作者:堕落年代  
这篇文章主要介绍了纯后端实现 Long/BigInteger ID 转为 JSON 字符串 的详细配置方案,s 基于 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
    @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字符串内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring实现定时任务的两种方法详解

    Spring实现定时任务的两种方法详解

    Spring提供了两种方式实现定时任务,一种是注解,还有一种就是接口了,这篇文章主要为大家介绍了这两种方法的具体实现方法,需要的可以参考下
    2024-12-12
  • 使用logback配置按天和文件大小切割输出日志

    使用logback配置按天和文件大小切割输出日志

    这篇文章主要介绍了使用logback配置按天和文件大小切割输出日志方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java 读取文本指定的某一行内容的方法

    Java 读取文本指定的某一行内容的方法

    今天小编就为大家分享一篇Java 读取文本指定的某一行内容的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • java使用JDBC动态创建数据表及SQL预处理的方法

    java使用JDBC动态创建数据表及SQL预处理的方法

    这篇文章主要介绍了java使用JDBC动态创建数据表及SQL预处理的方法,涉及JDBC操作数据库的连接、创建表、添加数据、查询等相关实现技巧,需要的朋友可以参考下
    2017-08-08
  • Struts2实现对action请求对象的拦截操作方法

    Struts2实现对action请求对象的拦截操作方法

    这篇文章主要介绍了Struts2实现对action请求对象的拦截操作方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-11-11
  • Spring Boot 启动参数之如何优雅地控制你的应用(最新推荐)

    Spring Boot 启动参数之如何优雅地控制你的应用(最新推荐)

    Spring Boot 提供了哪些方式来配置这些启动参数,今天我们就来详细解析 Spring Boot 启动参数的各种用法,并附带代码示例,让你可以灵活掌控应用的启动过程,需要的朋友可以参考下
    2025-04-04
  • 详解Elasticsearch如何实现简单的脚本排序

    详解Elasticsearch如何实现简单的脚本排序

    Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎,可以为所有类型的数据提供近乎实时的搜索和分析。本文主要介绍了Elasticsearch如何实现简单的脚本排序,感兴趣的可以了解一下
    2023-01-01
  • springcloud feign服务之间调用,date类型转换错误的问题

    springcloud feign服务之间调用,date类型转换错误的问题

    这篇文章主要介绍了springcloud feign服务之间调用,date类型转换错误的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 深入理解Java责任链模式实现灵活的请求处理流程

    深入理解Java责任链模式实现灵活的请求处理流程

    本文详细介绍了Java中的责任链模式,帮助您理解其工作原理,以及如何在代码中实现。该模式可以将请求沿着处理链路传递,实现灵活的请求处理流程。通过本文的学习,您将获得在Java应用程序中使用责任链模式的知识和技能
    2023-04-04
  • Spring中容器的创建流程详细解读

    Spring中容器的创建流程详细解读

    这篇文章主要介绍了Spring中容器的创建流程详细解读,Spring 框架其本质是作为一个容器,提供给应用程序需要的对象,了解容器的诞生过程,有助于我们理解 Spring 框架,也便于我们“插手”这个过程,需要的朋友可以参考下
    2023-10-10

最新评论