Как я могу сгенерировать определение openapi, которое поддерживает тело полиморфного запроса и может соответственно генерировать заглушки клиента и сервера?

#java #openapi #openapi-generator #springdoc

#java #openapi #openapi-generator #springdoc

Вопрос:

Допустим, у меня есть Spring Boot REST API со следующей конечной точкой и определенными моделями (для краткости параметры получения / установки опущены)

 @JsonTypeInfo( property = "type", include = JsonTypeInfo.As.PROPERTY, use = JsonTypeInfo.Id.NAME )
@JsonSubTypes( { @JsonSubTypes.Type( FooWidget.class ), @JsonSubTypes.Type( BarWidget.class ) } )
public interface Widget {}

public class BarWidget implements Widget { private String bar; }

public class FooWidget implements Widget { private String foo; }

public class WidgetGroup
{
    private List<Widget> widgets;
}

@RestController
public class WidgetController
{
    @PostMapping( "/widgets" )
    public void createWidgets( @RequestBody WidgetGroup widgets )
    {
    }
}
  

Возможно ли выразить это в спецификации OpenAPI, чтобы генератор мог оба

  • воспроизведите приведенный выше код в виде заглушек сервера и моделей
  • создайте клиент Javascript, который правильно представлял модели и API

Настроив это и попробовав springdoc и springfox сгенерировать мне спецификацию из кода, я не смог отменить процесс — приведенный выше код генерирует следующую спецификацию через Springdoc:

 openapi: 3.0.1
info:
  title: OpenAPI definition
  version: v0
servers:
  - url: 'http://localhost:8080'
    description: Generated server url
paths:
  /widgets:
    post:
      tags:
        - widget-controller
      operationId: createWidgets
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WidgetGroup'
        required: true
      responses:
        '200':
          description: OK
components:
  schemas:
    BarWidget:
      type: object
      allOf:
        - $ref: '#/components/schemas/Widget'
        - type: object
          properties:
            bar:
              type: string
    FooWidget:
      type: object
      allOf:
        - $ref: '#/components/schemas/Widget'
        - type: object
          properties:
            foo:
              type: string
    Widget:
      required:
        - type
      type: object
      properties:
        type:
          type: string
      discriminator:
        propertyName: type
    WidgetGroup:
      type: object
      properties:
        widgets:
          type: array
          items:
            oneOf:
              - $ref: '#/components/schemas/BarWidget'
              - $ref: '#/components/schemas/FooWidget'
  

При использовании генераторов Java и Javascript информация о наследовании, похоже, теряется и генерируются нечетные классы, такие как «BarWidgetAllOf». Является ли это ограничением выразительности спецификации OAS или просто ограничением в реализациях генераторов (я пробовал оба с генераторами swagger-codegen и openapitools)?

Ответ №1:

Сгенерированная спецификация OpenAPI верна относительно вашего кода.

Это не ограничение, но должна быть генерация по умолчанию, которая обычно используется.

Если вы хотите более точный контроль над сгенерированной спецификацией, вы можете использовать аннотацию swagger @Schema (без использования JsonSubTypes), как объясняется в этих двух выпусках с примерами: