如何使用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
相关产品推荐
相关产品推荐

