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

如何使用Swagger Core(springdoc-openapi)生成OpenAPI任意类型?

解决方法

方案一:自定义OpenApiCustomiser后处理生成的Schema(兼容性最佳)

该方案绕过Swagger Core的内部转换逻辑,在OpenAPI文档完全生成后做二次修正,不受Swagger Core版本限制,也不需要修改业务实体的注解配置:
在Spring配置类中注册如下Bean即可:

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.media.Schema;
import org.springdoc.core.customizers.OpenApiCustomiser;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Map;

@Configuration
public class OpenApiCustomConfig {

    @Bean
    public OpenApiCustomiser fixAnyTypeSchema() {
        return openApi -> {
            // 定位到TypeWithObject的Schema定义
            Schema<?> targetSchema = openApi.getComponents()
                    .getSchemas()
                    .get("TypeWithObject");
            if (targetSchema == null) {
                return;
            }
            Map<String, Schema<?>> props = targetSchema.getProperties();
            if (props != null && props.containsKey("value")) {
                // 移除默认生成的type属性,符合OAS3任意类型的定义
                props.get("value").setType(null);
            }
        };
    }
}

如果有多个需要设置为任意类型的字段,可以扩展上述逻辑,批量遍历所有Schema的属性统一处理即可。

方案二:字段加@Schema注解显式声明(代码侵入式,适合少量字段场景)

如果使用的Swagger Core版本在v2.2.0及以上,可以直接在Object类型字段上添加anyOf配置:

import io.swagger.v3.oas.annotations.media.Schema;

public class TypeWithObject {
    @Schema(anyOf = {Object.class}, description = "支持所有JSON数据类型")
    private Object value;

    // 原有getter、setter保持不变
    public Object getValue() { return value; }
    public void setValue(Object value) { this.value = value; }
}

该配置生成的Schema会自动不带type属性,完全符合你需要的任意类型要求。

避坑提示

不要使用@Schema(type = "any")这类写法,OpenAPI 3.0规范中没有any这个合法type取值,任意类型的正确表示就是不设置type属性。


内容的提问来源于stack exchange,提问作者M. Justin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:54:05