Springboot3+將ID轉(zhuǎn)為JSON字符串的詳細(xì)配置方案
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 配置
創(chuàng)建一個(gè)全局 ObjectMapper,讓所有 Long 類型自動(dòng)序列化為字符串:
@Configuration
public class JacksonConfig {
@Bean
@Primary
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
// Java 8 日期時(shí)間支持
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
// 去掉 null 字段
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
// 將 Long / long 轉(zhuǎn)為 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 都以字符串形式傳輸。這是社區(qū)常用解決方案,也是 StackOverflow 推薦做法 。
3. 精準(zhǔn)控制(可選)
如有需求,僅針對(duì)某些字段轉(zhuǎn)換,新增注解支持:
@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");
}
});
}
});
};
}使用步驟總結(jié)
引入依賴 - Jackson、JSR?310、SpringDoc。
配置全局 ObjectMapper - Long/String 自動(dòng)轉(zhuǎn)換。
(可選)添加 @StringId 注解 - 精細(xì)控制。
同步 OpenAPI Schema 類型 - Swagger 查看準(zhǔn)確。
測(cè)試驗(yàn)證:序列化、反序列化均正常。
測(cè)試示例
@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 精度問題,同時(shí) Swagger 文檔也保持一致。
如果需要我?guī)湍憧焖俾涞剡@套配置在你項(xiàng)目中,可以提供你 Spring Boot 和 SpringDoc 版本,我來進(jìn)一步定制配置。
到此這篇關(guān)于Springboot3+將ID轉(zhuǎn)為JSON字符串的詳細(xì)配置方案的文章就介紹到這了,更多相關(guān)Springboot ID轉(zhuǎn)JSON字符串內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中synchronized Lock(本地同步)鎖的8種情況
本文主要介紹了java中synchronized Lock(本地同步)鎖的8種情況,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Java獲取當(dāng)前時(shí)間的時(shí)間戳方法總結(jié)
Java中獲取時(shí)間戳的方式有很多種,下面這篇文章主要給大家介紹了關(guān)于Java獲取當(dāng)前時(shí)間的時(shí)間戳的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-06-06
解決get請(qǐng)求入?yún)NotNull驗(yàn)證不生效問題
這篇文章主要介紹了解決get請(qǐng)求入?yún)NotNull驗(yàn)證不生效問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
spring mvc實(shí)現(xiàn)文件上傳并攜帶其他參數(shù)的示例
本篇文章主要介紹了spring mvc實(shí)現(xiàn)文件上傳并攜帶其他參數(shù)的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02
簡(jiǎn)單學(xué)習(xí)Java+MongoDB
本文給大家介紹的是如何簡(jiǎn)單的使用java+MongoDB實(shí)現(xiàn)數(shù)據(jù)調(diào)用的問題,非常的實(shí)用,有需要的小伙伴可以參考下2016-03-03
Spring Boot CORS 配置方法允許跨域請(qǐng)求的最佳實(shí)踐方案
跨域請(qǐng)求在現(xiàn)代Web開發(fā)中非常重要,特別是在涉及多個(gè)前端和后端服務(wù)時(shí),本文詳細(xì)介紹了跨域請(qǐng)求的背景、重要性以及如何解決跨域問題,通過SpringBoot框架的CORS配置,可以有效地處理跨域請(qǐng)求,確保數(shù)據(jù)傳輸?shù)陌踩院陀脩趔w驗(yàn),感興趣的朋友跟隨小編一起看看吧2024-11-11

