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

如何在SpringDoc生成的OpenAPI文件中添加额外枚举?

解决Spring Boot 3 + springdoc 2.1.0手动添加枚举到OpenAPI出现自引用的问题

你遇到的问题是因为ModelConverters处理枚举类型时,返回的schema属性是指向自身的引用,而非实际的枚举定义。可以通过以下两种方式修复:

方式一:从ResolvedSchema中提取实际枚举定义

在添加模型到Components时,判断如果是枚举且当前schema为自引用,就从ResolvedSchema的schemas集合里取出实际的枚举定义:

@Bean
public OpenAPI customOpenAPI() {
    Components components = new Components();
    ModelConverters modelConverters = ModelConverters.getInstance();
    
    getModelsNotUsedInControllersToGenerate()
        .forEach(model -> {
            ResolvedSchema resolvedSchema = modelConverters.readAllAsResolvedSchema(model);
            Schema<?> targetSchema = resolvedSchema.schema;
            
            // 处理枚举的自引用问题
            if (model.isEnum() && targetSchema instanceof RefSchema refSchema) {
                String schemaName = refSchema.get$ref().split("/")[3];
                targetSchema = resolvedSchema.schemas.get(schemaName);
            }
            
            components.addSchemas(model.getSimpleName(), targetSchema);
        });
    
    return new OpenAPI()
        .components(components)
        .info(new Info().title("API"));
}

方式二:手动构建枚举Schema

如果方式一不生效,也可以直接手动构建枚举的Schema对象,指定枚举的所有取值:

@Bean
public OpenAPI customOpenAPI() {
    Components components = new Components();
    ModelConverters modelConverters = ModelConverters.getInstance();
    
    getModelsNotUsedInControllersToGenerate()
        .forEach(model -> {
            if (model.isEnum()) {
                StringSchema enumSchema = new StringSchema();
                // 获取枚举常量并转为字符串列表
                List<String> enumValues = Arrays.stream(model.getEnumConstants())
                    .map(Object::toString)
                    .collect(Collectors.toList());
                enumSchema.setEnum(enumValues);
                components.addSchemas(model.getSimpleName(), enumSchema);
            } else {
                components.addSchemas(
                    model.getSimpleName(),
                    modelConverters.readAllAsResolvedSchema(model).schema);
            }
        });
    
    return new OpenAPI()
        .components(components)
        .info(new Info().title("API"));
}

这两种方式都能避免枚举出现自引用,生成符合预期的OpenAPI枚举Schema定义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:32:59