Swagger-Codegen не использует расширение x -criminator-value вендора - PullRequest
1 голос
/ 29 января 2020

Я пытаюсь использовать swagger-codegen для генерации Java клиента API для спецификации схемы. В схеме используется расширение поставщика x-discriminator-value для создания модели наследования.

Например, я использовал спецификацию схемы, которую я нашел как yaml здесь и преобразовал в json (я завернул результат с "spe c" root, чтобы я мог отправить результат в онлайн-генератор кода, как будет объяснено ниже).

Когда я пытаюсь сгенерировать клиента Java как локально, так и с помощью онлайн-генератора кода я получаю, что десериализация не выполняется с использованием значения x-discriminator-value. Вместо этого это делается с названием модели. Я вижу это в сгенерированном файле JSON.java, который содержит карту от дискриминатора к классу:

            classByDiscriminatorValue.put("PhoneSetting".toUpperCase(), PhoneSetting.class);
            classByDiscriminatorValue.put("SceneSetting".toUpperCase(), SceneSetting.class);
            classByDiscriminatorValue.put("TextSetting".toUpperCase(), TextSetting.class);

[Чтобы увидеть это, вы можете post выше json до https://generator.swagger.io/api/gen/clients/java и проверить JSON.java file.

Из того, что я понимаю, я понял, что ключ должен иметь значение x-discriminator-value. Так, например, поскольку схема имеет:

  "SceneSetting": {
      "description": "Scene Setting",
      "x-discriminator-value": "SCENE",
      "allOf": [
        {
          "$ref": "#/definitions/SectionSetting"
        }, 

, тогда у меня должно быть отображение

            classByDiscriminatorValue.put("SCENE".toUpperCase(), SceneSetting.class);

вместо classByDiscriminatorValue.put ("SceneSetting" .toUpperCase (), SceneSetting. класс);

Буду признателен за любую помощь по этому вопросу.

1 Ответ

1 голос
/ 29 января 2020

Я бы порекомендовал перейти на OpenAPI 3.0 - он имеет встроенную поддержку сопоставления дискриминатора . Существуют конвертеры OAS2-в-OAS3 , которые помогут с миграцией, но вам придется обновлять сопоставления вручную.

В OpenAPI 3.0 сопоставления дискриминатора указываются в родительской схеме (не в дочерних схемах). Следующий пример в YAML для удобства чтения, вы можете использовать https://www.json2yaml.com для преобразования его в JSON.

openapi: 3.0.2

components:
  schemas:
    # Parent schema
    SectionSetting:
      type: object
      properties:
        ...
      discriminator:
        propertyName: PROP_NAME
        mapping:
          SCENE: SceneSetting
          ...

    # Child schema
    SceneSetting:
      description: Scene Setting
      allOf:
        - $ref: '#/components/schemas/SectionSetting'
        - ...

Убедитесь, что вы используете Swagger Codegen версии 3.x, потому что 2 .x не поддерживает OpenAPI 3.0. Вы можете получить последнюю версию 3.x CLI JAR от Maven Central:
https://mvnrepository.com/artifact/io.swagger.codegen.v3/swagger-codegen-cli

...