You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过自定义服务在Swagger UI中覆盖自定义ID对象的示例生成

解决SpringDoc Swagger UI中自定义值对象示例显示为字符串的问题

你已经通过Jackson处理了UserId的序列化/反序列化,现在要让Swagger UI里的请求体示例将userId显示为字符串而非嵌套对象,且不想用注解,可以通过SpringDoc的自定义扩展组件实现:

方案1:使用SchemaCustomizer自定义类型Schema

创建一个实现SchemaCustomizer的组件,针对UserId类型修改其OpenAPI Schema定义:

import org.springdoc.core.customizers.SchemaCustomizer;
import org.springframework.stereotype.Component;
import io.swagger.v3.oas.models.media.Schema;

@Component
public class UserIdSchemaCustomizer implements SchemaCustomizer {

    @Override
    public void customize(Schema schema, Class<?> type) {
        // 仅处理UserId类型
        if (type.equals(UserId.class)) {
            // 设置Schema类型为string,格式为uuid
            schema.setType("string");
            schema.setFormat("uuid");
            // 设置示例值
            schema.setExample("e73cd525-f324-4589-9498-006bd21750cd");
            // 清空原有的嵌套属性定义,避免显示嵌套结构
            schema.setProperties(null);
            schema.setAdditionalProperties(false);
        }
    }
}

这个组件会被Spring自动扫描并注册,SpringDoc在生成Schema时会自动调用它修改UserId的定义,最终请求体中的userId字段会显示为字符串示例。

方案2:使用OpenApiCustomiser全局修改Schema

如果需要更全局的控制,可以实现OpenApiCustomiser,直接修改生成好的OpenAPI文档中的UserId Schema:

import org.springdoc.core.customizers.OpenApiCustomiser;
import org.springframework.stereotype.Component;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.media.Schema;

import java.util.Map;

@Component
public class UserIdOpenApiCustomiser implements OpenApiCustomiser {

    @Override
    public void customise(OpenAPI openApi) {
        Map<String, Schema> schemas = openApi.getComponents().getSchemas();
        if (schemas != null && schemas.containsKey("UserId")) {
            Schema userIdSchema = schemas.get("UserId");
            userIdSchema.setType("string");
            userIdSchema.setFormat("uuid");
            userIdSchema.setExample("e73cd525-f324-4589-9498-006bd21750cd");
            userIdSchema.setProperties(null);
            userIdSchema.setAdditionalProperties(false);
        }
    }
}

说明

  • 两种方案都不需要在UserId类上添加任何Swagger相关注解,完全通过自定义服务实现。
  • 因为你已经处理了Jackson的序列化/反序列化,接口的实际请求响应不会受影响,仅Swagger UI的示例和Schema展示会改为字符串形式。

内容的提问来源于stack exchange,提问作者Huholoman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 05:40:13