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

标签 java spring-mvc openapi springdoc swagger-core

我正在开发一个使用 springdoc-openapi 的应用程序为其 Spring Controller 生成 OpenAPI v3 端点的库。该库使用 Swagger Core用于 Java 对象到 OpenAPI 模式的实际映射。

Controller 使用一个请求/响应类型,其中包含一个 Object 类型的属性。

public class TypeWithObject {
    private Object value;

    public Object getValue() { return value; }
    public void setValue(Object value) { this.value = value; }
}

因此,此类型可以是 data types 中的任何一个由 OpenAPI 定义:stringnumberintegerbooleanarray对象。请注意,object 是与其他类型不同的类型;例如字符串 boolean 不是对象

OpenAPI 3.0 Specification指定没有任何类型的架构将匹配任何数据类型。

A schema without a type matches any data type – numbers, strings, objects, and so on.

对此进行建模的正确方法是以下 Swagger 定义,其中 value 没有 type 属性:

{
  "openapi": "3.0.1",
  "info": {
    "title": "OpenAPI definition",
    "version": "v0"
  },
  "components": {
    "schemas": {
      "TypeWithObject": {
        "type": "object",
        "properties": {
          "value": {}
        }
      }
    }
  }
}

但是,每个未决问题 swagger-core#3834 ,Java Object 值映射到 OpenAPI object 类型,而不是任意类型。如上所述,这意味着此类 API 返回或接受非 OpenAPI 对象 的类型是不正确的,例如 string数字 boolean 值

我做了各种尝试让应用程序生成此类型作为 OpenAPI 任意类型,但没有成功。我在使用自定义 ModelConverter 时发现的一件事使用 Swagger Schema使用 null type 的原因是 Swagger Core 最终将类型转换为 object 作为其内部处理的一部分。目前,这被记录为 Swagger Core 的开放功能请求:swagger-core#4014 .

综上所述:如何让生成的类型使用 OpenAPI 任意类型?

最佳答案

一种方法是在单独的文件中手动定义任意类型架构,并使用 OpenAPI $ref 关键字(使用 @Schema(ref="...") 应用)来引用此类型。

api-docs-anyvalue.yml:

components:
  schemas:
    AnyValue: {}
import io.swagger.v3.oas.annotations.media.Schema;

public class TypeWithObject {
    @Schema(ref = "api-docs-anyvalue.yml#/components/schemas/AnyValue")
    private Object value;

    public Object getValue() { return value; }
    public void setValue(Object value) { this.value = value; }
}

结果:

{
  "openapi": "3.0.1",
  "info": {
    "title": "OpenAPI definition",
    "version": "v0"
  },
  "components": {
    "schemas": {
      "TypeWithObject": {
        "type": "object",
        "properties": {
          "value": {
            "$ref": "api-docs-anyvalue.yml#/components/schemas/AnyValue"
          }
        }
      }
    }
  }
}

关于java - 如何使用 Swagger Core (springdoc-openapi) 生成 OpenAPI 任意类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69257874/

相关文章:

java - 如何使用泛型参数将泛型类型转换为泛型类型?

java - Spring RestTemplate : Overridding ResponseErrorHandler not working when set in Configuration class

java - Spring MVC 表单 :radiobuttons tag not setting value attribute

java - QueryParam 在 Swagger API 中声明为不需要

asp.net-core - 如何将 "general info"部分添加到 NSwag 生成的 API 文档网站?

java - 使用 UTF-8 编码导出 HSQLDB 数据库

java - 将一串字母转换为数字

java - 无法对 CellTable 列进行排序

spring - Spring Boot 中不存在所需的请求部分 'file'

dictionary - Swagger:<字符串,对象> 的映射