当前位置: 首页 > 知识库问答 >
问题:

如何在生成Spring代码时使用OpenAPI“oneOf”属性与openapi-Generer-maven-plugin

长孙文栋
2023-03-14

我正在开发一个具有Angular前端和RESTful Spring Boot Backend的应用程序

我从org.openapitools.找到了这个非常方便的maven插件openapi生成器maven插件凭借其代码生成功能,它有助于在我们的应用编程接口的前端和后端之间实施“合同优先”的方法。但是我们的swagger文件在请求体和响应体定义中使用了“oneOf”属性。我试图从中生成Spring代码,但是生成的Java类缺少导入:

import com.pack.api.dto.OneOfLatteCoffeAmericanoCoffe;
import com.pack.api.dto.UNKNOWN_BASE_TYPE;

有没有办法将插件配置为与Swagger的oneOf属性一起工作?我用的是Spring靴2.3。1、Swagger 3.0和Openapi生成器maven插件4.3

共有3个答案

隆安然
2023-03-14

我们已经为一些生成器添加了更好的oneOf和anyOf支持,如java(jersey2)、cshing-netcore等。请用最新的大师试一试。快照版本可以在项目的README:https://github.com/OpenAPITools/openapi-generator/中找到

哈沛
2023-03-14

如果您可以修改您的招摇过市,您可以将中的一个替换为对抽象类型的引用。

例如,如果您的昂首阔步看起来像这样:

components:
  schemas:
    'Parent':
      'vehicle':
        oneOf:
        - type: object
          properties:
            'car_property':
              type: string
        - type: object
          properties:
            'truck_property':
              type: string

您可以这样修改它:

components:
  schemas:
    'Parent':
      'vehicle':
        $ref: '#/components/schemas/Vehicle'
    #---------------------------------------------------------------------------
    # Abstract class with discriminator 'vehicle_type'
    #---------------------------------------------------------------------------
    'Vehicle':
      type: object
      properties:
        'vehicle_type':
          type: string
          enum: [ 'CAR', 'TRUCK' ]
      discriminator:
        propertyName: vehicle_type
        mapping:
          'CAR': '#/components/schemas/Car'
          'TRUCK': '#/components/schemas/Truck'
    #---------------------------------------------------------------------------
    # Concrete classes
    #---------------------------------------------------------------------------
    'Car':
      allOf:
      - $ref: "#/components/schemas/Vehicle"
      - type: object
        properties:
          'car_property':
            type: string
    'Truck':
      allOf:
      - $ref: "#/components/schemas/Vehicle"
      - type: object
        properties:
          'truck_property':
            type: string

这种矫揉造作的修改使发电机工作。它处理相同的JSON对象,尽管我不能100%确定它在OpenAPI规范中是否语义等价。

濮阳宏硕
2023-03-14

目前,openapi生成器不支持oneOf。这是OpenAPI v3新引入的功能(仅供参考,只有v2及以下被称为“斯瓦格”,然后它被重命名为OpenAPI)。有各种各样的生成器(Java,Spring,许多其他语言)。我已经看到,在这一年中已经做出了贡献,以启用oneOf支持。

总而言之,看起来您还需要再等一会儿,直到您可以使用Spring生成器利用OpenAPI v3规范的此功能。

编辑:它也列在“短期路线图”上:

OAS3。0功能支持:anyOf、oneOf、回调等

 类似资料:
  • 我的目标是使用OpenAPI3.0生成Spring Boot REST客户端。 我希望首先生成API的OpenAPI规范文件(springdoc-openapi-maven-plugin),然后使用Maven从该文件(swagger-codegen-maven-plugin)生成客户机代码。 我的问题是swagger-codegen-maven-plugin在springdoc-openapi-m

  • 我定义OpenAPI 3.0文档并使用OpenAPI-generator-cli-3.3.4。jar生成Java代码(DTO)。但我无法解决这个问题:

  • 我试图在使用openapi 3规范设计的API中引入可为null的属性。其思想是始终将属性返回给客户端,无论其值是否为null。 YAML文件(我先尝试了,没有默认,结果相同): 生成Java代码: API的响应: 因此,无论属性是否为null,结果总是“present:true”。如果没有nullability,它就可以正常工作,除了从响应中删除不需要的null值。 有什么想法吗? P、 该物业

  • 我在OpenAPI定义中使用来引用映射对象。我的OAS部分如下所示: 使用

  • OpenAPI3.0规范规定,没有任何类型的模式将匹配任何数据类型。 没有类型的模式匹配任何数据类型--数字、字符串、对象等等。 因此,对此进行建模的正确方法是下面的Swagger定义,其中没有属性: 但是,每个开放问题Swagger-core#3834,Java值都映射到OpenAPI类型,而不是任意类型。如上所述,这意味着这样的API返回或接受不是OpenAPI的类型是不正确的,例如、、等。

  • 不幸的是,SpringFox还不支持OpenAPI3,而且,当我只想将最初的yaml公开为JSON时,使用基于反射的生成器似乎毫无意义。