Quarkus集成OpenAPI后Swagger UI如何全局设置MongoDB ObjectId输出格式
Quarkus OpenAPI 全局配置MongoDB ObjectId输出为字符串格式方案
你需要同时配置Jackson序列化规则和OpenAPI类型映射,即可同时满足接口实际返回、Swagger UI展示的双重要求:
1. 配置全局JSON序列化规则
- 首先自定义ObjectId的序列化/反序列化器,也可以直接引入官方提供的bson4jackson模块,这里推荐自定义实现更轻量:
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.module.SimpleModule; import org.bson.types.ObjectId; import io.quarkus.jackson.ObjectMapperCustomizer; import javax.ws.rs.ext.Provider; import java.io.IOException; @Provider public class ObjectIdJacksonConfig implements ObjectMapperCustomizer { @Override public void customize(ObjectMapper mapper) { SimpleModule objectIdModule = new SimpleModule(); // 序列化:将ObjectId转为十六进制字符串输出 objectIdModule.addSerializer(ObjectId.class, new JsonSerializer<ObjectId>() { @Override public void serialize(ObjectId value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeString(value.toHexString()); } }); // 反序列化:将传入的字符串转为ObjectId对象 objectIdModule.addDeserializer(ObjectId.class, new JsonDeserializer<ObjectId>() { @Override public ObjectId deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { return new ObjectId(p.getValueAsString()); } }); mapper.registerModule(objectIdModule); } }
2. 配置OpenAPI类型映射,修复Swagger UI展示
直接在application.properties中添加如下配置即可,不需要额外代码:
# 将ObjectId类型映射为OpenAPI的string类型 mp.openapi.schema.org.bson.types.ObjectId.type=string # 可选:指定格式标识 mp.openapi.schema.org.bson.types.ObjectId.format=objectid # 自定义Swagger UI上的示例值 mp.openapi.schema.org.bson.types.ObjectId.example=61338f5b47bfc65136b5de30
配置完成后重启应用,Swagger UI就会将ObjectId类型的字段展示为字符串格式,接口实际返回也会是你预期的十六进制字符串格式。
内容的提问来源于stack exchange,提问作者denis doni
相关产品推荐
相关产品推荐

